假设我有一个父类MyUser的modelForm,其中包含用户的公共信息。 用户有一个名为角色的字段,该字段指示他们在其中扮演什么角色,我为3个角色提供了3个特殊模型。 我想要做的是在保存表单时检查表单的角色字段,如果这是这3种特殊角色之一,则我想保存特殊的Model(它是MyUse ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我已重写AdminModel
的ModelForm
使User
领域的食用和可保存从Person
的管理变化形式。
class Person(models.Model):
user = models.OneToOneField(User)
#and also some char, text fields
@property
def name(self):
return self.user.first_name
@name.setter
def name(self, value):
self.user.first_name = value
#and by analogy surname and email properties
class PersonForm(ModelForm):
class Meta:
model = Person
name = forms.CharField(max_length=100, required=False)
surname = forms.CharField(max_length=100, required=False)
email = forms.EmailField(required=False)
def save(self, commit=True):
instance = super(PersonForm, self).save(commit)
user = instance.user
user.first_name = self.cleaned_data['name']
user.last_name = self.cleaned_data['surname']
user.email = self.cleaned_data['email']
user.save()
return instance
class PersonAdmin(admin.ModelAdmin):
fields = ['name', 'surname', 'email', 'and_others']
form = PersonForm
admin.site.register(Person, PersonAdmin)
但是我正在努力编写一个检查save()方法的测试:
def test_form_saves_values_to_instance_user_on_save(self):
"""
test that, form saves name, surname, email values to corresponding User
when commiting form
"""
user = User.objects.get(username='admin')
person = Person.objects.get(user=user)
personform = PersonForm(instance=person, data={'name': 'has_changed'})
# if uncommented raisesValueError: The Person could not be changed
# because the data didn't validate.
# personform.save()
self.assertEquals("has_changed", User.objects.get(pk=user.pk).first_name)
更新测试
更新解决方案。 原来,我没有填写所请求的不可见字段“用户”。 排除使表格有效并通过测试。
管理员
class PersonForm(ModelForm):
class Meta:
model = Person
exclude = ('user',)
# ...
tests.py
def test_form_saves_values_to_instance_user_on_save(self):
"""
test that, form saves name, surname, email values to corresponding User
when commiting form
"""
person = Person.objects.get(user__username='admin')
personform = PersonForm(instance=person, data={'name': 'has_changed'})
if personform.is_valid():
person = personform.save()
self.assertEquals(User.objects.get(pk=person.user.pk).first_name, "has_changed")
else:
self.fail("personform not valid")
def test_form_saves_values_to_instance_user_on_save(self):
"""
test form saves name, surname, email values to corresponding User object
when commiting form
"""
person = Person.objects.get(user__username='admin')
personform = PersonForm(instance=person, data={'name': 'has_changed'})
if personform.is_valid():
person = personform.save()
self.assertEquals(person.user.first_name, "has_changed")
else:
self.fail("personform not valid")
我认为您还需要从表单中排除user
字段
class PersonForm(ModelForm):
class Meta:
model = Person
exclude = ('user',)
...
将新数据作为字典传递到您的表单(作为第一个位置参数或作为data
),并断言personform.cleaned_data['name']
等于User.objects.get(pk=user.pk).username
。 然后对surname
和email
执行相同的操作。
请注意, first_name
和last_name
的max_length
为30,而表单字段的max_length
为100。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.