Django 为什么即使没有表单错误,我的POST请求也没有按照单元测试中的预期重定向?

Django 为什么即使没有表单错误,我的POST请求也没有按照单元测试中的预期重定向?,django,redirect,django-forms,http-post,django-unittest,Django,Redirect,Django Forms,Http Post,Django Unittest,我有一个带有表单的Django视图,我将在单元测试中发布到它。以下是测试的总体结构: class ViewTests(TestCase): form_url = reverse_lazy('myapp:form') success_url = reverse_lazy('myapp:success') def test_form_submission_with_valid_data_creates_new_object_and_redirects(self):

我有一个带有表单的Django视图,我将在单元测试中发布到它。以下是测试的总体结构:

class ViewTests(TestCase):
    form_url = reverse_lazy('myapp:form')
    success_url = reverse_lazy('myapp:success')

    def test_form_submission_with_valid_data_creates_new_object_and_redirects(self):
        attributes = EntryFactory.attributes()
        attributes['product'] = ProductFactory()  # Entry has a ForeignKey to Product
        response = self.client.post(self.form_url, attributes, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertRedirects(response, self.success_url)
        self.assertTemplateUsed(response, 'myapp/success.html')

然而,我似乎不明白为什么重定向没有按预期工作。我试着输入一个
导入pdb;pdb.set_trace()
查看是否存在任何表单错误(
response.context['form'].errors
),但我得到的只是一个空的dict。在浏览器中提交表单会正确重定向,因此我不确定单元测试失败的原因,而且也不知道如何正确地调试它,因为错误记录表中没有显示任何错误。

结果是有一些地方出错了

首先,实际上页面上还有第二个表单(用于选择
产品
),我错过了。与此相关,我应该将
ProductFactory().id
分配给
属性['product']
,而不是
ProductFactory

其次,在我更改了那个位之后,
assertRedirects
出现了一个问题;我必须将
self.success\u url
更改为
unicode(self.success\u url)
,因为
assertRedirects
无法与代理进行比较

最终产品:

def test_form_submission_with_valid_data_create_new_entry_and_redirects(self):
    attributes = EntryFactory.attributes()
    attributes['product'] = ProductFactory().id
    response = self.client.post(self.form_url, attributes)
    self.assertRedirects(response, unicode(self.success_url))

这是一个非常长的函数名哦,关于你的问题,由于重定向测试失败,我几乎不相信这与你的表单有任何关系。你能分享你的URL.py和你看到的失败消息吗?我怀疑一个坏的链接可能是这个问题的根源problem@yuvi当然是的,但是当有大量的单元测试时,这个“非常长的名称”会派上用场,你想从它的名称知道一个失败的单元测试会做什么。看起来“valid\u form\u和\u redirect”只是一个很好的名称。谢谢你的建议,我会考虑的