我有一个带上传字段的模型表单
我的表单
class AccountEditForm(forms.ModelForm):
telephone = forms.CharField(label=_('Telephone'), required=False,widget=forms.TextInput({'class': 'input-text input-box'}))
cv = forms.FileField(required=True,widget=forms.FileInput({'class': 'input-text input-box'}))
class Meta:
model = Profile
fields = ('telephone','cv')
我的观点
class AccountEdit(TemplateView):
template_name = 'base/account/edit.html'
def get(self,request,*args,**kwargs):
profile = request.user.profile
data = {
'form': AccountEditForm(instance=profile)
}
return render(request,self.template_name,data)
def post(self,request,*args,**kwargs):
profile = request.user.profile
form = AccountEditForm(request.POST,request.FILES,instance=profile)
if form.is_valid():
form.save()
messages.success(request, _('Successfully updated your account.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
data = {
'form': form
}
return render(request,self.template_name,data)
我的模板
<div class="form-group">
{{ form.telephone.label }}
{{ form.telephone }}
{% if form.telephone.errors %}
{{ form.telephone.as_text }}
{% endif %}
</div>
<div class="form-group">
{{ form.cv.label }}
{{ form.cv }}
{% if form.cv.errors %}
{{ form.cv.errors.as_text }}
{% endif %}
</div>
问题出现在编辑表单中,如果我更改了其他字段而没有显示上传文件并提交,则表示错误需要cv
答案
现在确定为什么但这有效,可以让任何人理解这个
cv = forms.FileField(required=True)
答案 0 :(得分:0)
您是否考虑在视图中扩展FormView而不是TemplateView
?
它会为您处理所有必要的表单实例化,因此您无需在get
和post
函数中创建,填充和验证。这肯定会让你更容易处理你的用例。
至于您的问题,您可能忘记在files
函数中的表单实例化中设置get
参数。请从Django文档中查看:File Upload
您可以尝试使用get
功能中的以下行吗?
data = {
'form': AccountEditForm(instance=profile, files=request.FILES)
}