Django单元测试表单,带有从请求对象分配的字段



我有这个表单

class PostCreationForm(forms.ModelForm):
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)

我正在尝试用这个测试对它进行单元测试

class PostCreationByFormTestCase(TestCase):
def __init__(self, *args, **kwargs):
super(PostCreationByFormTestCase, self).__init__(*args, **kwargs)
self.CustomUser = get_user_model()
def setUp(self):
self.credentials = {
'username': 'john_smith',
'password': 'St0ngPassw0rd'
}
self.user = self.CustomUser.objects.create(
username=self.credentials['username'],
email='john_smith@mail.com',
password=self.credentials['password'],
first_name='John',
last_name='Smith'
)
def test_simple_form(self):
form_data = {
'author': self.user,
'title': 'Simple Post',
'description': 'very good description',
}
form = PostCreationForm(form_data)
self.assertTrue(form.is_valid)
post = form.save()

断言通过,但form.save()产生django.db.utils.IntegrityError:列"中的空值;author_id";违反非空约束

我试着把表格改成

class PostCreationForm(forms.ModelForm):
def form_valid(self, form):
if not form.instance.author:
form.instance.author = self.request.user
return super().form_valid(form)

但它仍然不起作用。如果我不想将字段作为用户的输入,我认为这是一种推荐的将字段分配给对象的方法,在这种情况下,我希望文章的作者是当前用户。为了能够测试表单,我应该如何修复它?

检查表单是否有效时,需要调用方法is_valid,它不是属性。将form.is_valid更改为form.is_valid()即可。

但是,在检查form.is_valid()时不会调用form_valid(),因此您可能希望使用clean方法。一个未经测试的例子:

class PostCreationForm(forms.ModelForm):
def clean_author(self):
author = self.cleaned_data.get('author')
if not author:
author = self.request.user
return author