为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2023-06-27 14:44:54
我知道上面的错误意味着什么。似乎我无法在发布表单时处理它。我可以在基于函数的视图中做到这一点,但在基于类的视图中我有点迷失了。我正在创建一个评论应用程序,以下是应用程序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),但听起来出了问题,有人可以帮忙吗?谢谢
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

帖子由post基于类的视图的方法处理:


class BlogDetail(DetailView):

    # ...

    def post(self, request, *args, **kwargs):

        # all your form processing

Django 附带了多个视图,它们已经提供了表单处理过程的各种挂钩,例如 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"到上下文中。


查看完整回答
反对 回复 2023-06-27
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

你不需要DetailView. 您只需使用 CreateView 即可。我认为你已经正确覆盖了所有内容,以便能够放弃 DetailView,除了 get_form_kwargs() 之外。

然而...

我通常会以不同的方式处理这个问题,因为它很混乱而且很老套。相反,您可以通过 get_context_data() 将表单添加到 DetailView,然后在模板 post 中添加到/blog/{id}/comment/create,其中您有 CreateView。这让事情变得简单多了。


查看完整回答
反对 回复 2023-06-27
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

要允许向您的视图发送发布请求,请编写一个def post(self, request, *args, **kwargs)将接收发布请求的函数。如果您想像处理 get 一样处理此问题,请将其重定向到 get 函数

def post(self, request, *args, **kwargs):
    return self.get(request, *args, **kwargs)


查看完整回答
反对 回复 2023-06-27
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信