从kwargs为基于类的视图中的FK添加object_id



我正在编写一个非常简单的Comment应用程序。出于很多原因,我需要在这里写自己的东西,而不是使用像Disqus这样的伟大产品。

所以,我有一个页面,在这个页面上,特殊用户可以发表评论。

除了将页面id添加到表单提交之外,我已经完成了所有工作。

当我尝试使用隐藏的表单字段和form.cleand_data.时,我不断出现关键错误

所以现在我通过URL传递page_id。

我的网址.py

# Submit a comment
url(regex=r'^comment/create/(?P<page_id>d+)/$',
    view=CommentCreate.as_view(),
    name='comment_create',
),

我的观点.py

class CommentCreate(CreateView):
    success_url = reverse_lazy('comment_submitted')
    model = Comment
    template_name='learnd/comment_submitted.html'
    form_class = CommentCreateForm
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.page = self.kwargs['page_id']
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(CommentCreate, self).dispatch(*args, **kwargs)

我得到的错误是:

无法分配"u'1'":"Comment.page"必须是"page"实例。

这就是我迷路的地方。

我认为问题是kwargs正在用u:1重新调整字典,但我不知道如何只访问1来传递给我的视图。

欢迎任何帮助。

谢谢。

在分配Page对象之前,您需要查找它:

def form_valid(self, form):
    page = get_object_or_404(Page, pk=self.kwargs.get('page_id'))
    self.object = form.save(commit=False)
    self.object.user = self.request.user
    self.object.page = page
    self.object.save()
    return HttpResponseRedirect(self.get_success_url())

或者,您可以执行self.object.page_id = self.kwargs['page_id'],但您会面临传入的page_id不是有效的Page的风险,并且object.save()将引发异常。

最新更新