2010-06-24 18 views
7

मैं इन Django SuperForms के एक अद्यतन संस्करण की तलाश में हूं। ऐसा लगता है कि यह Django 1.2 में काम करने के लिए प्रतीत नहीं होता है। विशेष रूप से, मैं इसे मॉडलफॉर्म के साथ काम करना चाहता हूं।Django यौगिक/घोंसला/subforms?

मेरा उपयोग केस लगभग उसके समान है; मेरे पास Address मॉडल है जो मैं विभिन्न स्थानों में उप-फॉर्म के रूप में उपयोग करना चाहता हूं। दृश्य func में सब कुछ कोशिश करने और गठबंधन करने के लिए यह दर्द है।

+0

सुपरफॉर्म क्या करना चाहते हैं? –

+0

क्या आप मूल रूप से 'मॉडलफॉर्म' चाहते हैं जो विदेशी कुंजी को पार करता है? – sdolan

+0

@sdolan: ऐसा कुछ, हाँ। खैर, न केवल * ट्रैवर्स विदेशी कुंजी, क्योंकि तब सबफॉर्म को मॉडल से उत्पादित स्वचालित रूप से जेनरेट किए गए फॉर्म पर आधारित होना होगा। मैं वास्तव में एम्बेड करने के लिए एक और फॉर्म (या मॉडल फॉर्म) चुनने में सक्षम होना चाहता हूं। – mpen

उत्तर

5

मैं w/1.2 काम करने के लिए superforms.py नवीनीकृत किया है, और टिकट आप से जुड़ा हुआ करने के लिए इसे संलग्न: http://code.djangoproject.com/attachment/ticket/3706/superform.2.py

एक परियोजना मैं उस पर काम कर रहा हूँ इस से फायदा हो सकता है नहीं है, इसलिए मैं मैं लगा समय बिताएं और आपकी मदद भी करें।

ध्यान रखें कि मुझे यह काम करने के लिए मिला है w/1.2, और वास्तव में आंतरिक को साफ करने की कोशिश नहीं की। अब जब मेरे पास एपीआई साबित करने वाले टेस्ट केस हैं, तो मैं वापस जा सकता हूं और इसे बाद में साफ कर सकता हूं।

यदि आप इसे मॉडलफॉर्म के साथ उपयोग कर रहे हैं और आप बचत() कार्यक्षमता चाहते हैं तो आपको अपने सुपरफॉर्म क्लास पर विधि को ओवरराइड करना होगा।

मैं वर्तमान में इसे अपने "सामान्य" भंडार w/~ 90% कोड कवरेज में स्थानीय रूप से स्थानीय रूप से रखता हूं जिसमें कई सबफॉर्म, मिश्रित सबफॉर्म & घोषित रूपों और मॉडलफॉर्म शामिल हैं। मैंने नीचे दिए गए टेस्ट केस शामिल किए हैं (सावधान रहें कि यह मेरे TestCaseBase वर्ग का उपयोग करता है, लेकिन इससे आपको एपीआई का सारांश मिलना चाहिए)। यदि आपके कोई प्रश्न हैं, या मुझे याद आया कोई भी क्षेत्र मुझे बताएं।

from django_common.forms.superform import SuperForm, SubForm 
from django_common.test import TestCaseBase 
from django import forms 

class WhenSuperFormsIsUsedWithOnlySubForms(TestCaseBase): 
    def get_superform_with_forms(self, post_data=None): 
     class AddressForm(forms.Form): 
      street = forms.CharField(max_length=255) 
      city = forms.CharField(max_length=255) 

     class BusinessLocationForm(forms.Form): 
      phone_num = forms.CharField(max_length=255) 

     class TestSuperForm(SuperForm): 
      address = SubForm(AddressForm) 
      business_location = SubForm(BusinessLocationForm) 

     return TestSuperForm(data=post_data) 

    def should_not_be_valid_with_no_data(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_false(tsf.is_valid()) 

    def should_have_two_sub_forms(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(len(tsf.base_subforms), 2) 
     self.assert_equal(len(tsf.forms), 2) 

    def should_display_as_ul(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(tsf.as_ul(), '<li><label for="id_business_location-phone_num">Phone num:</label> <input id="id_business_location-phone_num" type="text" name="business_location-phone_num" maxlength="255" /></li>\n<li><label for="id_address-street">Street:</label> <input id="id_address-street" type="text" name="address-street" maxlength="255" /></li>\n<li><label for="id_address-city">City:</label> <input id="id_address-city" type="text" name="address-city" maxlength="255" /></li>') 

    def should_display_as_table(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(tsf.as_table(), '<tr><th><label for="id_business_location-phone_num">Phone num:</label></th><td><input id="id_business_location-phone_num" type="text" name="business_location-phone_num" maxlength="255" /></td></tr>\n<tr><th><label for="id_address-street">Street:</label></th><td><input id="id_address-street" type="text" name="address-street" maxlength="255" /></td></tr>\n<tr><th><label for="id_address-city">City:</label></th><td><input id="id_address-city" type="text" name="address-city" maxlength="255" /></td></tr>') 

    def should_display_as_p(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(tsf.as_p(), '<p><label for="id_business_location-phone_num">Phone num:</label> <input id="id_business_location-phone_num" type="text" name="business_location-phone_num" maxlength="255" /></p>\n<p><label for="id_address-street">Street:</label> <input id="id_address-street" type="text" name="address-street" maxlength="255" /></p>\n<p><label for="id_address-city">City:</label> <input id="id_address-city" type="text" name="address-city" maxlength="255" /></p>') 

    def should_display_as_table_with_unicode(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(tsf.__unicode__(), tsf.as_table()) 

    def should_be_valid_if_good_data(self): 
     data = { 
      'business_location-phone_num' : '8055551234', 
      'address-street' : '1234 Street Dr.', 
      'address-city' : 'Santa Barbara', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_true(tsf.is_valid()) 
     self.assert_equal(tsf.cleaned_data['business_location']['phone_num'], 
          '8055551234') 
     self.assert_equal(tsf.cleaned_data['address']['street'], '1234 Street Dr.') 
     self.assert_equal(tsf.cleaned_data['address']['city'], 'Santa Barbara') 

    def should_be_invalid_if_missing_data(self): 
     data = { 
      'business_location-phone_num' : '8055551234', 
      'address-street' : '1234 Street Dr.', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_false(tsf.is_valid()) 

     self.assert_false(tsf.errors['business_location']) 
     self.assert_true(tsf.errors['address']) 
     self.assert_equal(tsf.errors['address']['city'], ['This field is required.']) 

    def should_be_invalid_if_invalid_data(self): 
     data = { 
      'business_location-phone_num' : '8055551234', 
      'address-street' : '1234 Street Dr.', 
      'address-city' : '', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_false(tsf.is_valid()) 


class WhenSuperformsIsUsedWithSubFormsAndDeclaredFields(TestCaseBase): 
    """Some basic sanity checks that working with fields combined with SubForms works.""" 
    def get_superform_with_forms(self, post_data=None): 
     class AddressForm(forms.Form): 
      street = forms.CharField(max_length=255) 

     class TestSuperForm(SuperForm): 
      name = forms.CharField(max_length=255) 
      address = SubForm(AddressForm) 

     return TestSuperForm(data=post_data) 

    def should_not_be_valid_with_no_data(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_false(tsf.is_valid()) 

    def should_have_two_forms_and_a_single_subform(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(len(tsf.base_subforms), 1) 
     self.assert_equal(len(tsf.forms), 2) 

    def should_print_as_table(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(tsf.as_table(), '<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="255" /></td></tr>\n<tr><th><label for="id_address-street">Street:</label></th><td><input id="id_address-street" type="text" name="address-street" maxlength="255" /></td></tr>') 

    def should_validate_when_fields_exist(self): 
     data = { 
      'name': 'Sam', 
      'address-street': 'Some Street', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_true(tsf.is_valid()) 

     self.assert_equal(tsf.cleaned_data['name'], 'Sam') 
     self.assert_equal(tsf.cleaned_data['address']['street'], 'Some Street') 

    def should_not_validate_with_invalid_data(self): 
     data = { 
      'name': '', 
      'address-street': 'Some Street', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_false(tsf.is_valid()) 

     self.assert_equal(tsf.errors['name'], ['This field is required.']) 



class WhenSuperformsIsUsedWithModelForms(TestCaseBase): 
    def get_superform_with_forms(self, post_data=None): 
     from django.db import models 
     class Address(models.Model): 
      city = models.CharField(max_length=255) 

     class AddressForm(forms.ModelForm): 
      class Meta: 
       model = Address 

     class TestSuperForm(SuperForm): 
      address = SubForm(AddressForm) 

     return TestSuperForm(data=post_data) 

    def should_not_be_valid_with_no_data(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_false(tsf.is_valid()) 

    def should_have_two_forms_and_a_single_subform(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(len(tsf.base_subforms), 1) 
     self.assert_equal(len(tsf.forms), 1) 

    def should_print_as_table(self): 
     tsf = self.get_superform_with_forms() 
     self.assert_equal(tsf.as_table(), '<tr><th><label for="id_address-city">City:</label></th><td><input id="id_address-city" type="text" name="address-city" maxlength="255" /></td></tr>') 

    def should_validate_when_fields_exist(self): 
     data = { 
      'address-city': 'Some City', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_true(tsf.is_valid()) 

     self.assert_equal(tsf.cleaned_data['address']['city'], 'Some City') 

    def should_not_validate_with_invalid_data(self): 
     data = { 
      'address-city': '', 
     } 
     tsf = self.get_superform_with_forms(data) 
     self.assert_false(tsf.is_valid()) 

     self.assert_equal(tsf.errors['address']['city'], ['This field is required.']) 

आनंद लें!

+0

वाह, यह कमाल है! बहुत बहुत धन्यवाद :) दुर्भाग्यवश यह मेरे वर्तमान प्रोजेक्ट के लिए थोड़ा देर हो गया (एक और सोलन मिला), लेकिन शायद मेरे अगले के लिए! – mpen

+0

हाँ, कोई समस्या नहीं है। प्रश्न प्रस्तुत करने और एक अच्छा प्रारंभिक बिंदु देने के लिए धन्यवाद। यह ऐसा कुछ है जो मेरे लिए लंबे समय तक उपयोगी होता। आपके अन्य समाधान के लिए, आप क्या कर रहे हैं? ओह, और क्या मैंने बक्षीस कमाया? :) – sdolan

+0

आपने निश्चित रूप से किया था। मुझे लगता है कि आपका कोड वास्तव में काम करता है;) मैंने क्या किया? एक प्रोग्रामर केवल सबसे कमजोर चीज कर सकता है! स्क्रैच से * पूरे * फॉर्म एप को फिर से लिखा! – mpen