Django报错:'Product'对象无'status_code'属性,表单开发求助
问题分析与修复方案
1. URL配置错误(核心报错原因)
你的urls.py中存在重复路径配置,且第一个路径直接将Product模型类作为视图传入——Django的URL路由要求绑定视图函数/类视图,而非模型类。当请求进入时,Django会尝试调用该模型类作为视图,而模型返回的是Product对象,并非标准HTTP响应,因此会触发'Product' object has no attribute 'status_code'错误。
修复:
删除错误的模型路径配置,保留正确的视图映射:
# urls.py path('upload_product/', views.uploadProduct, name="upload_product"), path('', views.upload_product_ok_page, name='upload_product_ok_page'),
2. 模型类冗余方法
models.py中的get方法完全多余,模型类无需此类视图逻辑,直接删除:
# models.py class Product(models.Model): product_name = models.CharField(max_length=100) product_price = models.IntegerField() product_photo = models.ImageField(upload_to='product_photos', max_length=100) # 移除以下冗余方法 # def get(self, request): # a = Product() # return a
3. Form类字段定义错误
forms.py中直接将字段赋值为控件类(如forms.TextInput())的写法错误,ModelForm中指定控件需通过widget参数:
# forms.py class UploadProduct(ModelForm): class Meta: model = Product fields = ['product_name', 'product_price', 'product_photo'] widgets = { 'product_name': forms.TextInput(), 'product_price': forms.NumberInput(), 'product_photo': forms.FileInput(), }
4. 视图函数的两处问题
- 处理文件上传时,POST请求需同时传入
request.FILES,否则表单无法接收上传文件 - GET请求返回表单时,应传入表单实例(
UploadProduct()),而非表单类本身
修复:
# views.py def uploadProduct(request): if request.method == 'POST': # 传入request.FILES处理文件上传 form = UploadProduct(request.POST, request.FILES) if form.is_valid(): form.save() return redirect('upload_product_ok_page') # 使用URL name跳转更可靠 else: # 实例化表单 form = UploadProduct() return render(request, 'upload_product.html', {'form': form}) def upload_product_ok_page(request): return HttpResponse('ok')
5. 模板优化(可选)
为了更友好地显示表单和错误提示,可修改模板:
<form method="POST" action="{% url 'upload_product' %}" enctype="multipart/form-data"> {% csrf_token %} {% for field in form %} <div> {{ field.label_tag }} {{ field }} {% if field.errors %} <span style="color: red;">{{ field.errors.0 }}</span> {% endif %} </div> {% endfor %} <button>Submit</button> </form>
完成以上修改后,重新运行项目,表单上传功能即可正常工作。
内容的提问来源于stack exchange,提问作者Angela
相关产品推荐
相关产品推荐

