2011-03-02 79 views
2

我想验证表单的一个字段。这里是我的模型:如何通过忽略必填字段来验证特定表单的字段?

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

你可以在你的模型上设置'required = False'属性吗? – Glycerine

+0

我无法将它们设置为False,因为第一次创建用户配置文件时需要这些字段,但是在虚拟形象更新中,这些字段不是必需的 – iva123

回答

2

你可以有两种选择,要么你:

  1. 编写自定义窗体说更新头像时AvatarForm,并用它来代替,或者你可以
  2. 编写验证化身场的自定义功能,称为它而不是form.is_valid()

我说,去第一个,这是更容易的方式和验证已经为您处理,当你调用is_valid()方法。下面是你的形式可能类似于:

class AvatarForm(forms.Form): 
    avatar = forms.ImageField() 
2

要扩大gladysbixly的回答,您可以使用ModelForm这么你不需要直接声明一个字段:

from django import forms 


class AvatarForm(forms.ModelForm): 
    class Meta: 
     model = Person 
     fields = (
      'avatar', 
     ) 

我觉得这个解决方案在大多数情况下更清洁一些...

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()方法中运行的相关代码。