如何通过忽略必填字段来验证特定表单的字段?

时间:2011-03-02 17:52:04

标签: django validation

我想验证表单的一个字段。这是我的模特:

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()时,我认为它看起来也是必需的其他信息。所以你有一个想法,我怎么能只验证头像部分?

3 个答案:

答案 0 :(得分:2)

您可以选择两个选项:

  1. 写一个自定义表单,说AvatarForm并在更新头像时使用它,或者你可以
  2. 编写一个自定义函数来验证头像字段并调用它而不是form.is_valid()
  3. 我说,转到第一个,这样更容易,并且在调用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()方式运行的任何相关代码。