2010-10-04 9 views
6

कृपया नीचे दिए गए कोड को देखते हैं। असल में, जब उपयोगकर्ता इस वर्ग का ऑब्जेक्ट बनाता है, तो उन्हें value_type निर्दिष्ट करने की आवश्यकता होती है। यदि value_type==2 (प्रतिशत), तो percentage_calculated_on (जो फ़ॉर्म/टेम्पलेट पक्ष पर एक चेकबॉक्स चयन करें बहुमत है, एक या अधिक आइटमों की जांच की आवश्यकता है। मॉडल सत्यापन मुझे अनुमति देने की अनुमति नहीं दे रहा है जैसा कि मैं कोशिश कर रहा हूं - यह मूल रूप से फेंकता है अपवाद है कि मुझसे कहता है उदाहरण के अनेक-से-अनेक संबंध इस्तेमाल किया जा सकता से पहले एक प्राथमिक कुंजी मान होना चाहिए कि। लेकिन मैं पहले सहेजने से पहले वस्तु को मान्य करने की जरूरत है। मैं फार्म (modelform) की ओर इस मान्यता की कोशिश की है (फार्म के स्वच्छ विधि का उपयोग कर), लेकिन एक ही बात भी वहाँ होता है।Django manytomany सत्यापन

मैं इस मान्यता प्राप्त करने के बारे जाते हैं?

INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible')) 
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage')) 

class Payable(models.Model): 
    name = models.CharField() 
    short_name = models.CharField() 
    inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES) 
    value = models.DecimalField(max_digits=12,decimal_places=2) 
    value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES) 
    percentage_calculated_on = models.ManyToManyField('self', symmetrical=False) 

    def clean(self): 
     from django.core.exceptions import ValidationError 
     if self.value_type == 2 and not self.percentage_calculated_on: 
      raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.") 
+0

मैंने मनोज गोविंदन के उत्तर को "स्वीकृत" के रूप में चिह्नित किया है क्योंकि यह समस्या हल करता है। हालांकि, मैं अभी भी Django के मॉडल सत्यापन का उपयोग करके इसे सत्यापित करना चाहता हूं। तो अगर किसी के पास कोई विचार है, तो इसे यहां पोस्ट करने का प्रयास करें। धन्यवाद। – chefsmart

+0

एक ही प्रश्न: http://stackoverflow.com/questions/7986510/django-manytomany-model- validation – user920391

उत्तर

2

मैं अपने proje से एक में अपने कोड बाहर का परीक्षण किया सीटीएस 'एडमिन ऐप। मैं एक कस्टम ModelForm का उपयोग करके आवश्यक सत्यापन करने में सक्षम था। निचे देखो।

# forms.py 
class MyPayableForm(forms.ModelForm): 
    class Meta: 
     model = Payable 

    def clean(self): 
     super(MyPayableForm, self).clean() # Thanks, @chefsmart 
     value_type = self.cleaned_data.get('value_type', None) 
     percentage_calculated_on = self.cleaned_data.get(
      'percentage_calculated_on', None) 
     if value_type == 2 and not percentage_calculated_on: 
      message = "Please specify on what payables/deductibles ..." 
      raise forms.ValidationError(message) 
     return self.cleaned_data 

# admin.py 
class PayableAdmin(admin.ModelAdmin): 
    form = MyPayableForm 

admin.site.register(Payable, PayableAdmin) 

Admin ऐप (के रूप में आप कर के बजाय CheckboxSelectMultiple) SelectMultiple विजेट का उपयोग करता है कई रिश्तों के लिए कई प्रतिनिधित्व करने के लिए। मेरा मानना ​​है कि इससे कोई फर्क नहीं पड़ता।

+0

एरर ... वास्तव में 'model' 'admin.ModelAdmin' की विशेषता है? –

+0

@ डोमिनिक: यह निश्चित रूप से नहीं है: पी इसे इंगित करने के लिए धन्यवाद। मैंने इसे ठीक कर दिया है। –

+0

मैं अपने ModelForm भीतर कुछ इसी तरह कर रहा हूँ, सिवाय मैं सुपर (MyPayableForm, आत्म) .clean() पहले और है कि मैं self.instance.value_type और self.instance.percentage_calculated_on बजाय का उपयोग कहते हैं। – chefsmart

संबंधित मुद्दे