Django:警告 - 不允许使用方法(POST)

我知道上面的错误意味着什么。似乎我无法在发布表单时处理它。我可以在基于函数的视图中做到这一点,但在基于类的视图中我有点迷失了。


我正在创建一个评论应用程序,以下是应用程序forms.py中的内容comment:


class CommentForm(forms.Form):

    content_type = forms.CharField(widget=forms.HiddenInput)

    object_id = forms.CharField(widget=forms.HiddenInput)

    body = forms.CharField(widget=forms.Textarea)

然后在DetailView博客应用程序中,我这样处理:


class BlogDetail(DetailView):

    model = Blog

    template_name = 'blogs/blog_detail.html'

    context_object_name = 'blog'


    def get_object(self):

        blog_slug = self.kwargs.get('blog_slug')

        return get_object_or_404(Blog, slug=blog_slug)


    def get_context_data(self, *args, **kwargs):

        obj = self.get_object()

        context = super().get_context_data(**kwargs)

        context['comments'] = Comment.objects.filter_by_instance(obj)


        """ comment form """

        initial_data = {

            'content_type': obj.get_content_type,

            'object_id': obj.id

        }

        if self.request.method == 'POST':

            form = CommentForm(self.request.POST, initial=initial_data)

            if form.is_valid():

                c_type = form.cleaned_data.get('content_type')

                content_type = ContentType.objects.get(model=c_type)

                object_id = form.cleaned_data.get('object_id')

                body = form.cleaned_data.get('body')

                new_comment, created = Comment.objects.get_or_create(

                    user=self.request.user,

                    content_type=content_type,

                    object_id=object_id,

                    body=body

                )

        else: 

            form = CommentForm(initial=initial_data)


        context['comment_form'] = form


        return context

虽然我通过了form = CommentForm(self.request.POST, initial=initial_data),但听起来出了问题,有人可以帮忙吗?谢谢

慕田峪4524236
浏览 247回答 3
3回答

一只萌萌小番薯

帖子由post基于类的视图的方法处理:class BlogDetail(DetailView):    # ...    def post(self, request, *args, **kwargs):        # all your form processingDjango 附带了多个视图,它们已经提供了表单处理过程的各种挂钩,例如 FormView,您可以利用它们:class BlogDetail(DetailView, FormView):    form_class = CommentForm    def form_valid(self, form):        c_type = form.cleaned_data.get('content_type')        # ...    def get_initial(self):        obj = self.get_object()        return {            'content_type': obj.get_content_type,            'object_id': obj.id        }    # ....默认情况下,表单被传递"form"到上下文中。

子衿沉夜

你不需要DetailView. 您只需使用 CreateView 即可。我认为你已经正确覆盖了所有内容,以便能够放弃 DetailView,除了 get_form_kwargs() 之外。然而...我通常会以不同的方式处理这个问题,因为它很混乱而且很老套。相反,您可以通过 get_context_data() 将表单添加到 DetailView,然后在模板 post 中添加到/blog/{id}/comment/create,其中您有 CreateView。这让事情变得简单多了。

慕丝7291255

要允许向您的视图发送发布请求,请编写一个def post(self, request, *args, **kwargs)将接收发布请求的函数。如果您想像处理 get 一样处理此问题,请将其重定向到 get 函数def post(self, request, *args, **kwargs):     return self.get(request, *args, **kwargs)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python