Django报错:QueryDict对象无status_code属性,求助解决
问题解决:Django CreateView重写post方法返回context报错
你的核心问题是视图的post方法直接返回了QueryDict对象,但Django要求所有视图必须返回HttpResponse或其子类(比如RedirectResponse),这就是报错的根源。而且你当前的写法完全绕开了CreateView内置的表单验证、数据保存逻辑,根本没法完成广告的创建。
正确实现方式:重写form_valid方法(推荐)
不需要手动处理POST数据,利用CreateView的form_valid方法,在表单验证通过后给模型设置user字段,这才是符合Django CBV设计逻辑的做法:
- 先修改表单类名(避免和视图类同名造成混淆):
class CreateAdvertForm(forms.ModelForm): class Meta: model = Advertisment fields = ['category', 'title', 'description', 'image']
- 修改视图类,重写
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
相关产品推荐
相关产品推荐

