在这里,我使用CreateView来创建项目,之后我将重定向用户以更新当前创建的对象的其他字段。
下面是我的代码:
Views.py
class DynamicCreate(CreateView):
model = Dynamic
form_class = DynamicForm
template_name = 'book/dynamic_create.html'
def form_valid(self, form):
book = form.save(commit=False)
book.user = User.objects.get(pk=(self.request.user.pk))
book.save()
return reverse('book:dynamicupdate', args=(self.object.id))
Urls.py
url(r'^book/create/$', views.DynamicCreate.as_view(), name='dynamiccreate'),
url(r'^book/delete/(?P<pk>[\w]+)/$', views.DynamicDelete.as_view(), name='dynamicdelete'),
url(r'^book/update/(?P<pk>[\w]+)/$', views.DynamicUpdate.as_view(), name='dynamicupdate'),
但在这里我得到的错误:
Exception Type: AttributeError
Exception Value: 'NoneType' object has no attribute 'id'
我通过其他以前问过的问题,如This,但我不知道我在这里错过了什么。我的CreateView能够在表中创建/保存数据,但无法重定向我更新视图页。
5条答案
按热度按时间gwbalxhn1#
继承自ModelFormMixin的form_valid方法包含设置self的逻辑。对象复制到新创建的对象,但重写方法使用book变量。将args更改为参考书,如上所述,效果很好。
另一个选择是用self替换book变量。对象,如果只是遵循默认方法设置的示例。
0g0grzrc2#
我通过将
return reverse('book:dynamicupdate', args=(self.object.id))
更改为return redirect('book:dynamicupdate', book.id)
来修复它反向需要ViewName不是url,所以我将
reverse
改为redirect
,这里我的对象是book,所以我将self.object
替换为book
感谢@丹尼尔Roseman的帮助
jyztefdp3#
正如solarissmoke所解释的,'form_valid'必须返回一个响应对象,而不是一个url!
然后我会写:
注意:
book.user.id = self.request.user.id
而不是用户示例更简洁的是,在www. example中添加get_absolute_url www.example.com
并在视图中引用此函数:
0s7z1bwu4#
尝试将该行更改为:
在代码中的任何地方都没有定义self.object。
a0zr77ik5#
通过在模型中定义
get_absolute_url
,您可以重定向到“book:dynamicupdate”,并使用创建/更新示例的pk。models.py
urls.py
参见 www.example.com