You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django报错:QueryDict对象无status_code属性,求助解决

问题解决:Django CreateView重写post方法返回context报错

你的核心问题是视图的post方法直接返回了QueryDict对象,但Django要求所有视图必须返回HttpResponse或其子类(比如RedirectResponse),这就是报错的根源。而且你当前的写法完全绕开了CreateView内置的表单验证、数据保存逻辑,根本没法完成广告的创建。

正确实现方式:重写form_valid方法(推荐)

不需要手动处理POST数据,利用CreateView的form_valid方法,在表单验证通过后给模型设置user字段,这才是符合Django CBV设计逻辑的做法:

  1. 先修改表单类名(避免和视图类同名造成混淆):
class CreateAdvertForm(forms.ModelForm):
    class Meta:
        model = Advertisment
        fields = ['category', 'title', 'description', 'image']
  1. 修改视图类,重写form_valid方法:
class CreateAdvert(CreateView):
    form_class = CreateAdvertForm
    template_name = 'marketapp/createadvert.html'
    context_object_name = 'advert'
    # 可选:设置创建成功后的跳转页面,比如广告列表页
    # success_url = reverse_lazy('advert_list')

    def form_valid(self, form):
        # 给待保存的广告对象设置当前登录用户
        form.instance.user = self.request.user
        # 调用父类方法完成数据保存和重定向
        return super().form_valid(form)

为什么这么做?

  • 完全复用CreateView的内置逻辑:自动处理表单验证,验证失败时会重新渲染模板并显示错误信息,不用自己写判断。
  • 直接用self.request.user获取当前登录用户,比通过email查询更高效且不会出错(避免用户邮箱重复或变更导致的查询问题)。
  • 返回的是符合要求的重定向响应,彻底解决报错问题。

如果你非要手动处理POST(不推荐)

如果坚持要自己处理POST数据,必须构造HttpResponse对象返回,示例如下(但不建议这么做,因为要自己处理表单验证、错误捕获等,代码冗余):

from django.shortcuts import render, redirect

class CreateAdvert(CreateView):
    form_class = CreateAdvertForm
    template_name = 'marketapp/createadvert.html'
    context_object_name = 'advert'

    def post(self, request):
        form = self.form_class(request.POST, request.FILES)
        if form.is_valid():
            advert = form.save(commit=False)
            advert.user = self.request.user
            advert.save()
            # 重定向到成功页面
            return redirect('advert_detail', pk=advert.pk)
        # 表单验证失败,重新渲染模板
        return render(request, self.template_name, {'form': form})

内容的提问来源于stack exchange,提问作者bl4z3rr666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:05:22