2011-08-17 16 views
7

ModelForm'u birkaç alana sahibim. Bazı alanların gerekli, bazıları değil. Ayrıca farklı seçenekler içeren bir Seçim alanım var ve bu alan için "gerekli" veya bazı alanların seçilmesini istiyorum.Django modelform diğer alan seçimine göre "required" özelliğini kaldır

Ben

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      self.fields['other_field'].required = False 
    return cleaned_data 

ama Haklısınız fikrim yok ama sorun bireysel saha doğrulamaları zaten formda önce çalıştırmak olmasıdır

cevap

10

Cleaning and validating fields that depend on each other adresindeki Django belgelerine bakın. standart uygulama yerine taşıma aşağıdaki gerçekleştirmek olacaktır:

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      # 'other_field' is conditionally required. 
      if not cleaned_data['other_field']: 
       raise forms.ValidationError("'Other_field' is required.") 
    return cleaned_data 
+0

teşekkür ederiz. Bu fikir onu elde etmeme yardımcı oldu! – Igor

+0

Benzer bir doğrulama (Django 1.4) yapmam gerekiyor, ancak test ettiğim alan sadece benim salt okunurumda yok (btw - yönetici olarak yapıyorum). Bu salt okunur alanın değerini nasıl aktaracağınıza dair bir fikriniz var mı? 10x – Lin

+0

Çözüm bulundu - form.instance tüm ilgili verileri tutar ve değiştirilmiş veri form.changed_data – Lin

1

çalışmıyor Formunun temiz() yönteminde çalıştı temiz. Birkaç seçeneğin var. Alanı gerekmeyebilir ve form.clean’unuzda gerekli olduğunda mantığını kullanabilirsiniz. Veya alanı gerektiği gibi bırakabilir ve temizlikte artabileceği doğrulama hatalarını kaldırabilirsiniz.

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      if 'other_field' in self.errors: 
       del self.errors['other_field'] 
       cleaned_data['other_field'] = None 
    return cleaned_data 

Bu

o tüm hataları değil, sadece eksik/gerekli hataları kaldırır ki bazı sorunları var. Ayrıca cleaned_data ile ilgili bir sorun var. Artık clean_data içinde olmayan zorunlu bir alan var, bu yüzden onu None olarak ekledim. Uygulamanızın geri kalanı bu davayı ele almak zorunda kalacak. Değeri olmayan zorunlu bir alana sahip olmak tuhaf görünebilir.

2

ortak bir şekilde gerekli alan için hata mesajı yazdırmak isterseniz, bunu yapabilirsiniz:

def clean(self): 
    cleaned_data = super(PasswordChangeForm, self).clean() 
    token = cleaned_data.get('token') 
    old_password = cleaned_data.get('old_password') 
    if not token and not old_password: 
     self._errors['old_password'] = self.error_class([self.fields['old_password'].error_messages['required']]) 
+0

Bu cevap gerçekten çok yararlı! Çok teşekkürler ! – Serafeim

İlgili konular