User
필드를 Person
의 admin 변경 양식에서 식용하고 저장할 수 있도록 AdminModel
의 ModelForm
을 재정의했습니다. 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")
이'ValueError를 반환 데이터가' –
을 validate.'하지 않았기 때문에 사람이 변경할 수 없습니다 self.assertEquals (user.first_name, "has_changed")'는 사용자의 데이터가 데이터베이스에서 다시로드되지 않으므로 정의에 의해 실패합니다. 따라서 변경할 수 없습니다. – knbk
personform을 유효하게 만드는 방법 또는 유효하지 않은 것은 무엇입니까? –