我想验证表单的一个字段。这是我的模特:
class Person(models.Model):
user = models.ForeignKey(User)
avatar = models.ImageField(upload_to=get_upload_path)
creation_time = models.DateTimeField(auto_now=True)
在我看来,我想让用户更新他们的头像。因此,当用户单击“更新”按钮时,我只想发送头像文件并仅对其进行验证。
我的update_avatar视图在这里:
@csrf_exempt
def update_avatar(request,user_id):
profile_owner = Person.objects.get(user__id = user_id)
form = ProfileSettings()
if request.method == 'POST':
form = ProfileSettings(request.POST,request.FILES)
if form.is_valid():
return HttpResponse("ok")
return HttpResponse("else")
#the code is not complete, this is for only testing purpose =)
当我调用form.is_valid()时,我认为它看起来也是必需的其他信息。所以你有一个想法,我怎么能只验证头像部分?
答案 0 :(得分:2)
您可以选择两个选项:
我说,转到第一个,这样更容易,并且在调用is_valid()方法时已经为您处理了验证。以下是您的表单的外观:
class AvatarForm(forms.Form):
avatar = forms.ImageField()
答案 1 :(得分:2)
要扩展gladysbixly的答案,您可以使用ModelForm s,这样您就不需要直接声明字段了:
from django import forms
class AvatarForm(forms.ModelForm):
class Meta:
model = Person
fields = (
'avatar',
)
在大多数情况下,我发现这个解决方案更清洁......
答案 2 :(得分:0)
查看django.forms.forms.BaseForm._clean_fields
,了解当您致电is_valid()
时Django如何验证每个字段。
如果要验证表单中的单个字段,请正常绑定数据,然后(基本上)只调用该字段的clean()
方法。
请注意,您必须复制_clean_fields()
中的部分设置代码:
@csrf_exempt
def update_avatar(request,user_id):
profile_owner = Person.objects.get(user__id = user_id)
if request.method == 'POST':
form = ProfileSettings(request.POST, request.FILES)
# Validate avatar.
field = form.fields['avatar']
initial = form.initial.get('avatar', field.initial)
upload = field.widget.value_from_datadict(form.data, form.files, form.add_prefix('avatar'))
try:
avatar = field.clean(upload, initial)
# Avatar is valid.
return HttpResponse("ok")
except ValidationError as e:
# Avatar is invalid.
return HttpResponse(e.message)
else:
form = ProfileSettings()
return HttpResponse("else")
但是你需要注意两个难题:
clean_avatar()
方法,则需要明确调用该方法。_post_clean()
方式运行的任何相关代码。