0

User 필드를 Person의 admin 변경 양식에서 식용하고 저장할 수 있도록 AdminModelModelForm을 재정의했습니다. 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) 

그러나 나는() 메소드 저장 확인하는 테스트를 작성에 어려움을 겪고 있어요 :

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

난 당신이 또한

class PersonForm(ModelForm): 
    class Meta: 
     model = Person 
     exclude = ('user',) 
    ... 
+0

이'ValueError를 반환 데이터가' –

+1

을 validate.'하지 않았기 때문에 사람이 변경할 수 없습니다 self.assertEquals (user.first_name, "has_changed")'는 사용자의 데이터가 데이터베이스에서 다시로드되지 않으므로 정의에 의해 실패합니다. 따라서 변경할 수 없습니다. – knbk

+0

personform을 유효하게 만드는 방법 또는 유효하지 않은 것은 무엇입니까? –

1

새로운 전달 양식에서 user 필드를 제외 할 필요가 있다고 생각 y에 대한 사전으로서의 데이터 우리 양식을 (첫 번째 위치 인수 또는 data), personform.cleaned_data['name']User.objects.get(pk=user.pk).username과 같다고 주장하십시오. 그런 다음 surnameemail에 대해 동일하게 수행하십시오. 양식 필드가있는 동안

참고 first_namelast_namemax_length (30)의 가지고 max_length의 100