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

时间:2013-07-11 23:31:32

标签: django django-views django-class-based-views

我正在撰写一个非常简单的评论应用。由于一系列原因,我需要在这里写自己的,而不是使用像Disqus这样的优秀产品。

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

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

当我尝试使用隐藏的表单字段和form.cleaned_data时,我一直收到关键错误。

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

我的urls.py

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

我的views.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来传递给我的视图。

欢迎任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

在分配之前,您需要查找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()会抛出异常。