2012-11-21 14 views
5

मेरे पास 2 मॉडल, Structure और Bracket के साथ एक Django प्रोजेक्ट है, ब्रैकेट के पास संरचना के लिए एक विदेशीकी है (यानी एक से कई, एक संरचना में कई ब्रैकेट हैं)। मैंने व्यवस्थापक साइट के लिए TabularInline बनाया है, ताकि संरचना पर ब्रैकेट की एक तालिका होगी। मैं एक कस्टम के लिए कुछ अतिरिक्त सत्यापन करने के लिए कुछ एक कस्टम clean विधि के साथ formset कहा, यदि आप एक ब्रैकेट है कि एक ही संरचना पर एक और ब्रैकेट के विरोध में है नहीं कर सकते हैं आदिपरीक्षण इनलाइनफॉर्मसेट स्वच्छ तरीके

व्यवस्थापक इस तरह दिखता है:

class BracketInline(admin.TabularInline): 
    model = Bracket 
    formset = BracketInlineFormset 

class StructureAdmin(admin.ModelAdmin): 
    inlines = [ 
     BracketInline 
    ] 
admin.site.register(Structure, StructureAdmin) 

बस इतना ही काम करता है, और मान्यता काम करता है:

BracketInlineFormset सिर्फ स्वच्छ विधि है।

हालांकि अब मैं अपने जटिल फॉर्मेट सत्यापन तर्क का परीक्षण करने के लिए कुछ अनजान लिखना चाहता हूं।

मेरी पहली ज्ञात-अच्छे संस्कार मान्य करने के लिए प्रयास है:

data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
formset = BracketInlineFormset(data) 
self.assertTrue(formset.is_valid()) 

हालांकि वह काम नहीं करता और अपवाद को जन्म देती है:

====================================================================== 
ERROR: testValid (appname.tests.StructureTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/paht/to/project/tests.py", line 494, in testValid 
    formset = BracketInlineFormset(data) 
    File "/path/to/django/forms/models.py", line 672, in __init__ 
    self.instance = self.fk.rel.to() 
AttributeError: 'BracketInlineFormset' object has no attribute 'fk' 

---------------------------------------------------------------------- 

Django documentation (formset सत्यापन के लिए) एक अर्थ है सकते हैं यह करो।

यह कैसे काम नहीं कर रहा है? मैं अपने इनलाइन फॉर्मेट के लिए कस्टम क्लीन()/सत्यापन का परीक्षण कैसे करूं?

+0

क्या BracketInlineFormset की घोषणा की तरह लग रहा है? –

+0

@JohnMee इनलाइन फॉर्मेट कोड प्रश्न में जोड़ा गया – Rory

उत्तर

4

आप एक कस्टम इनलाइन फॉर्मेट बनाने के लिए django.forms.models से inlineformset_factory विधि का उपयोग कर सकते हैं। यह विधि उस पर पारित मूल वर्ग के आधार पर आपके स्वरूप में एफके मान सेट करती है।

structure = StructureFactory() #foreign key 
data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
BIFormset = inlineformset_factory(Structure, Bracket, formset=BracketInlineFormset) 
formset = BIFormset(data, prefix='form', instance=structure) 
self.assertTrue(formset.is_valid()) 

नोट formset=BracketInlineFormset पैरामीटर जबकि कारखाने के साथ formset निर्माण।

संदर्भ: Django Docs

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