关于 django FileField 处理和清理方法的问题
question on django FileField handling and clean method
我有一个相当简单的模型:
class Product(models.Model):
data = models.JSONField()
number = models.PositiveIntegerField()
我可以通过表格更新:
class ProductForm(forms.Form):
def __init__(self, *args, **kwargs):
product = kwargs.pop("product")
super().__init__(*args, **kwargs)
self.fields["number"] = forms.IntegerField()
self.fields[product.data.keys()[0]] = forms.CharField()
self.fields[product.data.keys()[1]] = forms.FileField()
...
def clean(self):
cleaned_data = super().clean()
print(cleaned_data.get("image")) ## prints None
print(self.files) ## prints:
一切正常,我将表单放入模板中并设置了 enctype="multipart/form-data"
属性,然后我在 TemplateView
:
中收到了表单
class ProductUpdateView(TemplateView):
template_name = "update_product.html"
def post(self, request, *args, **kwargs):
obj = Product.objects.get(pk = kwargs["pk"])
print(request.FILES) ## prints the correct filename!
form = ProductForm(request.POST or None, product = obj)
for key in request.POST.keys():
...
obj.save()
context = {'product': obj}
return render(request, self.template_name, context)
为什么 self.files
打印 None
,cleaned_data.get("image")
打印 <MultiValueDict: {}>
,但在视图中,request.FILES
正确地知道 <MultiValueDict: {'image': [<InMemoryUploadedFile: test.png (image/png)>]}>
?
在视图中,您需要正确使用表单并使用以下方法构造它:
ProductForm(request.POST<strong>, request.FILES</strong>, product=obj)
我有一个相当简单的模型:
class Product(models.Model):
data = models.JSONField()
number = models.PositiveIntegerField()
我可以通过表格更新:
class ProductForm(forms.Form):
def __init__(self, *args, **kwargs):
product = kwargs.pop("product")
super().__init__(*args, **kwargs)
self.fields["number"] = forms.IntegerField()
self.fields[product.data.keys()[0]] = forms.CharField()
self.fields[product.data.keys()[1]] = forms.FileField()
...
def clean(self):
cleaned_data = super().clean()
print(cleaned_data.get("image")) ## prints None
print(self.files) ## prints:
一切正常,我将表单放入模板中并设置了 enctype="multipart/form-data"
属性,然后我在 TemplateView
:
class ProductUpdateView(TemplateView):
template_name = "update_product.html"
def post(self, request, *args, **kwargs):
obj = Product.objects.get(pk = kwargs["pk"])
print(request.FILES) ## prints the correct filename!
form = ProductForm(request.POST or None, product = obj)
for key in request.POST.keys():
...
obj.save()
context = {'product': obj}
return render(request, self.template_name, context)
为什么 self.files
打印 None
,cleaned_data.get("image")
打印 <MultiValueDict: {}>
,但在视图中,request.FILES
正确地知道 <MultiValueDict: {'image': [<InMemoryUploadedFile: test.png (image/png)>]}>
?
在视图中,您需要正确使用表单并使用以下方法构造它:
ProductForm(request.POST<strong>, request.FILES</strong>, product=obj)