- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有两个具有多对一关系的对象,例如 Car
和 Manufacturer
,并且想要捕获 first_car_name
Manufacturer
的 >,即制造商制造的第一辆汽车。
我有以下两个模型:
from django.db import models
from django.urls import reverse
class Manufacturer(models.Model):
name = models.CharField(max_length=255)
first_car_name = models.CharField(max_length=255, blank=True)
def get_absolute_url(self):
return reverse('manufacturer-detail', kwargs={'pk': self.id})
class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer', on_delete=models.CASCADE)
name = models.CharField(max_length=255)
以下views.py
:
from django.http import HttpResponseRedirect
from django.views.generic import UpdateView
from django.views.generic.detail import DetailView
from myapp.models import Manufacturer, Car
class ManufacturerDetailView(DetailView):
model = Manufacturer
class AddCarView(UpdateView):
model = Manufacturer
fields = ['first_car_name']
def form_valid(self, form):
Car.objects.get_or_create(
name=form.cleaned_data['first_car_name'],
manufacturer=self.object)
self.object.refresh_from_db()
if self.object.car_set.count() == 1:
return super().form_valid(form)
return HttpResponseRedirect(self.get_success_url())
以下urls.py
,
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('manufacturer/<int:pk>/', views.ManufacturerDetailView.as_view(), name='manufacturer-detail'),
path('manufacturer/<int:pk>/add-car/', views.AddCarView.as_view(), name='add-car')
]
以及 tests.py
中的以下单元测试:
from django.test import TestCase
from django.urls import reverse
from myapp.models import Manufacturer, Car
class ManufacturerViewTests(TestCase):
def test_add_car(self):
manufacturer = Manufacturer.objects.create(name='Ford')
self.client.post(
reverse('add-car', kwargs={'pk': manufacturer.id}),
data={'first_car_name': 'Model T'})
self.assertEqual(Car.objects.count(), 1)
self.assertEqual(Car.objects.first().name, 'Model T')
self.assertEqual(Car.objects.first().manufacturer, manufacturer)
manufacturer.refresh_from_db()
self.assertEqual(manufacturer.first_car_name, 'Model T')
self.client.post(
reverse('add-car', kwargs={'pk': manufacturer.id}),
data={'first_car_name': 'Focus'})
manufacturer.refresh_from_db()
self.assertEqual(manufacturer.first_car_name, 'Model T')
我注意到当我注释掉该行时
self.objects.refresh_from_db()
在重写的 form_valid()
方法中,测试通过了,但实际上,我收到以下断言错误:
>
python manage.py test myapp.tests
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_add_car (myapp.tests.ManufacturerViewTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/kurtpeek/Documents/myproject/myapp/tests.py", line 20, in test_add_car
self.assertEqual(manufacturer.first_car_name, 'Model T')
AssertionError: '' != 'Model T'
+ Model T
----------------------------------------------------------------------
Ran 1 test in 0.017s
FAILED (failures=1)
我很难确定为什么从数据库刷新模型实例会导致此测试失败,并且无论如何,如果是这种情况,它似乎有点“脆弱”。有什么想法可以解决这个错误吗?
(顺便说一句,我有一个工作实现,相当于 Car
模型的 CreateView
,其 form_valid()
方法更新 Manufacturer
,但出于一致性原因,我希望这是 Manufacturer
模型的 UpdateView
)。
最佳答案
原来,当进入form_valid()
方法时,表单数据已经保存到self.object
中,但还没有提交到数据库,所以当您运行 self.object.refresh_from_db()
时,在调用 中执行
。我最终采用了不同的方法,将其设为 Carl 模型的模型 View ,而不是 Manufacturer 模型的模型 View 。self.object = form.save()
之前,您会“丢失”表单数据>super().form_valid(form)
关于python - 如何让 Django UpdateView 仅在第一次工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57349802/
我有一个表单类,看起来像.. #forms.py class ExampleForm(forms.Form): color = forms.CharField(max_length=25)
是否可以从与pk相关的网址中删除UpdateView? 例如,如果我有 url(r'^myobj/update/(?P\d+)/$', views.UpdateMyObj.as_view(), nam
我创建了一个继承UpdateView的类 View 。我已经指定了应该构建表单的字段和模型。现在假设我有一封现场电子邮件,那么我想在表单中禁用它。我不知道如何做到这一点。 class UserUpda
是否可以将多个模型传入 UpdateView ? 就像是: models = (FirstModel, SecondModel) 最佳答案 不是通过 models UpdateView 的属性. 但是
我有以 slugfield 作为主键的模型。 当我点击更新按钮时,我有更新 View ,它会创建新对象。 例如: 旧记录:标题=数据1 更新条目:标题=数据2 输出: 数据2 数据1 模型.py cl
所以我将 UpdateView 设置为向表单发送一个 request 对象,这样我就可以修改表单中的查询集(基于 request.user) 我的观点.py: class DataSourceUpda
我有一个 Users和 Jobs .如果一些User创建一个 Job , 然后他/她才能编辑这个 Job 的一些信息. 于是他访问了url .../job/update/ .如果Job是由他创建的(U
我有以下单元测试 def test_category_update_view(self): """ Make sure that a category can be updated
我有这样的架构: 模型.py: class Evento(models.Model): [...] user = ForeignKey(model=User) 表单.py: class
我正在使用 UpdateView 更新一系列字段。但是,我只希望将已修改的字段保存到数据库中。如果在更新过程中未为某个字段提供值,我希望将以前的值用作默认值。如果为字段提供了新值,则只应更新该字段。我
Django 和编程菜鸟在这里。我已经制作了一个我想要部署的应用程序,但我需要弄清楚如何将对该对象的创建者的 UpdateView 访问限制为,我很难过。 当前,用户可以使用 CreateView .
我想控制只有 super 用户,例如老师,可以访问继承自 UpdateView 的页面,并将其他人重定向到 /404 页面. 我在 views.py 中的类: class Edit_news(Upda
我有一个网站,用户可以在其中创建和编辑自己的列表。 我正在使用通用 View CreateView 来允许用户创建列表。 我想使用通用 View UpdateView 来允许他们编辑列表,但 logi
在Django中基于类的UpdateView中,我排除了用户字段,因为它是系统内部的,并且我不会要求它。现在,将用户传递到表单的Django正确方法是什么。 (我现在的操作方式是,将用户传递到表单的
我希望我的用户能够查看页面、更新该页面,然后返回到该页面或继续进行更多编辑。 这是显示信息的 View : # urls.py url(r'^gameview/$', views.G
我有一个具有 ManyToMany 关系的模型,我想用 CheckBoxSelectMultiple 小部件更新它,而其他所有小部件都使用默认的通用表单,但是当我重新定义一个表单字段时,它是唯一一个显
我有一个 Expense模型和 ExpenseLineItem模型。就像典型的费用/发票一样,一项费用可以有多个行项目来构成发票的总成本。我正在尝试使用基于类的 View 来创建和更新费用。我已经成功
我尝试了通用 View 的简约 django 实现来上传个人资料图片。 View .py class UpdateProfile(UpdateView): form_class = Updat
编辑: 对我来说更好的解决方案是使用权限系统,特别是因为我需要对对象进行其他类型的受控访问。我现在使用 Django-guardian 来帮助处理这样的对象级权限。 原文: 我正在通过让用户上传故事以
有没有办法在更新 View 中更新唯一字段?我有一个具有 name 和 age 字段的模型,但是当我尝试更新 age 时甚至不更改 的值name,它返回一个错误,该名称已存在于数据库中 模型.py c
我是一名优秀的程序员,十分优秀!