2011-03-02 96 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()方法中運行的相關代碼。