gpt4 book ai didi

python - 发布到 Django 表单时,是否发布了所有字段?

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:51 25 4
gpt4 key购买 nike

我正在尝试为表单编写一个测试来模拟我只想更新一个字段的情况。这是测试:

from django.test import TestCase
from django.forms.models import model_to_dict

class FamilyDemographicsUpdateTest(TestCase):
def test_update_phone_types_with_fields_from_family_factory(self):
# Create a family for which the employee uses an iPhone
family = FamilyFactory(employee_phone_type=Family.IPHONE)
url = reverse('dashboard:family', kwargs={'pk': family.id, 'tab': 'family-demographics'})

data = model_to_dict(instance=family, fields=FamilyDemographicsForm.base_fields)

form = FamilyDemographicsForm(data=data)

之后我使用 import ipdb; ipdb.set_trace() 进入调试器。正是在这里,我注意到formerrors :

ipdb> form.errors
{'employee_email': ['This email is already taken.']}

这可以追溯到Family表单所基于的模型。表格是ModelForm :

class FamilyDemographicsForm(forms.ModelForm):
class Meta:
model = Family

该 View 基于Django的通用UpdateView :

class FamilyUpdate(SuccessMessageMixin, DashboardAccessMixin, UpdateView):
template_name = 'families/edit.html'
model = Family
success_message = "Family was updated successfully."

def get_form_class(self, **kwargs):
tab = self.kwargs['tab']
if tab == 'family-demographics':
return FamilyDemographicsForm

以及相应的Family对象有一个 clean()触发此错误的方法(在 class Family(models.Model) 中):

def clean(self):
if self.employee_email:
db_user = User.objects.filter(username=self.employee_email).first()
if db_user and db_user.family and db_user.family != self:
raise ValidationError({'employee_email': 'This email is already taken.'})
if self.partner_email:
db_user = User.objects.filter(username=self.partner_email).first()
if db_user and db_user.family and db_user.family != self:
raise ValidationError({'partner_email': 'This email is already taken.'})

但是,如果我实际上在浏览器中使用该表单并提交,它似乎工作得很好。简而言之,当你在浏览器中提交表单时,是不是相当于 post正在处理的数据 - 对于您尚未更改的字段 - 与最初的数据相同吗?为什么此错误在此测试中触发,而不是在浏览器中触发?

最佳答案

这与发布数据完全无关。问题是您的 View 是一个更新,它将现有实例传递给表单,以便 Django 知道如何更新它。你的测试没有做到这一点。

(您的测试并不是真正测试您的代码;您实际上应该使用请求工厂或测试客户端调用 View ,v 并将数据传递到其中。)

关于python - 发布到 Django 表单时,是否发布了所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48819387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com