0

我已覆盖AdminModelModelForm使User字段可以从Person的管理员更改表格中获得并保存。如何测试ModelForm save()方法将更改保存在模型中?

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) 

UPD测试

UPD解决方案。事实证明,我没有填写要求无形字段'用户'。排除使表格有效并通过测试。

admin.py

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") 

回答

1
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',) 
    ... 
+0

这将返回'ValueError异常:该人不能被改变,因为该数据没有validate.' –

+1

' self.assertEquals(user.first_name,“has_changed”)'''''''''''''''''''''''''''''''''''''因为'user'中的数据不会从数据库重新加载,所以无法更改。 – knbk

+0

如何使personform有效或使其失效? –

1

通过新数据作为y的字典我们的表格(作为第一位置参数或data),并断言personform.cleaned_data['name']等于User.objects.get(pk=user.pk).username。然后对surnameemail执行相同操作。

注意first_namelast_name有30 max_length,而你的表单字段有max_length的100

相关问题