आप इसे ओवरराइड save
विधि में कर सकते हैं। याद रखने की बात यह है कि Django मॉडल उदाहरण वास्तविक डेटाबेस ऑब्जेक्ट्स नहीं हैं, वे लोड पर वहां से अपने मूल्य प्राप्त करते हैं। तो मौजूदा मान प्राप्त करने के लिए आप अपने वर्तमान ऑब्जेक्ट को सहेजने से पहले आसानी से डेटाबेस पर वापस जा सकते हैं।
def save(self, *args, **kwargs):
if self.status == 'pending':
old_instance = MyClass.objects.get(pk=self.pk)
if old_instance.status == 'activated':
raise SomeError
super(MyModel, self).save(*args, **kwargs)
वर्तमान में अपवाद बढ़ाने के अलावा उपयोगकर्ता को एक त्रुटि संदेश लौटने का कोई अच्छा तरीका नहीं है। वर्तमान में 'मॉडल सत्यापन' को सक्षम करने के लिए Google ग्रीष्मकालीन कोड प्रोजेक्ट है, लेकिन यह कुछ महीनों तक तैयार नहीं होगा।
यदि आप व्यवस्थापक में कुछ ऐसा करना चाहते हैं, तो सबसे अच्छा तरीका एक कस्टम मॉडलफॉर्म को एक ओवरराइड clean()
विधि के साथ परिभाषित करना है। हालांकि, इस बार यह एक रूप है क्योंकि आपके पास पहले से ही डीबी को मारने के बिना पुराने मूल्यों तक पहुंच है। एक अन्य लाभ यह है कि आप उपयोगकर्ता को एक फॉर्म सत्यापन त्रुटि वापस कर सकते हैं।
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def clean_status(self):
status = self.cleaned_data.get('status', '')
if status == 'pending':
if self.instance and self.instance.status == 'activated':
raise forms.ValidationError(
'You cannot change activated to pending'
)
return status
class MyModelAdmin(forms.ModelAdmin):
form = MyModelForm
model = MyModel
स्रोत
2009-05-15 06:35:08
+1 - मैं वही चीज़ सोच रहा हूं।मेरे मामले में कुछ भारी कर्तव्य कार्य है जो एक बचत विधि में किया जाता है जो केवल तभी आवश्यक होता है जब मॉडल के फ़ील्ड के किसी विशेष उप-समूह में कोई फ़ील्ड बदल गया हो, और मैं यह जांचने का एक तरीका ढूंढ रहा हूं कि यह मामला है या नहीं । धन्यवाद! –