2012-12-19 59 views
1

我剛開始使用香脆的形式和我已經注意到如何被描述的形式一些違規行爲,將它有什麼樣的影響在道路上Django的酥脆形式__init__

在github上,佈局了example在說明如下

class MessageForm(forms.Form): 

    [...] 

    # Uni-form 
    helper = FormHelper() 
    helper.form_class = 'form-horizontal' 
    helper.layout = Layout(
     Field('text_input', css_class='input-xlarge'), 
     Field('textarea', rows="3", css_class='input-xlarge'), 
     'radio_buttons', 
     Field('checkboxes', style="background: #FAFAFA; padding: 10px;"), 
     AppendedText('appended_text', '.00'), 
     PrependedText('prepended_text', '<input type="checkbox" checked="checked" value="" id="" name="">', active=True), 
     PrependedText('prepended_text_two', '@'), 
     'multicolon_select', 
     FormActions(
      Submit('save_changes', 'Save changes', css_class="btn-primary"), 
      Submit('cancel', 'Cancel'), 
     ) 
    ) 

和零件的documentations

class ExampleForm(forms.Form): 
    [...] 
    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      Fieldset(
       'first arg is the legend of the fieldset', 
       'like_website', 
       'favorite_number', 
       'favorite_color', 
       'favorite_food', 
       'notes' 
      ), 
      ButtonHolder(
       Submit('submit', 'Submit', css_class='button white') 
      ) 
     ) 
     super(ExampleForm, self).__init__(*args, **kwargs) 

我很困惑,看看使用def __init__(self, *args, **kwargs):行爲示例裏面的文檔。爲什麼在使用第一個示例中顯示的方法簡單定義表單時使用它?他們中的任何一個都會有什麼好處/缺點?

回答

0

這樣做在__init__方法允許基於表單內容修改助手(顯示/隱藏按鈕),直到呈現。

個人爲了保持靈活性和減少傭工的計算,我把它放在屬性屬性中。

這讓我也有自然獨立的兒童形式助手。

在使用靜態幫助器處理單個表單的簡單情況下,您的方法非常棒。否則,這可能是危險的。

我用給定的屬性,它讓我感覺更像是一種擴展形式API一個mixin:

class MyFormMixin 
    @property 
    def helper(self): 
     helper = FormHelper() 

     if hasattr(self, "parent_url"): 
      back = layout.Button('back', 'Return button text') 
      back.field_classes += ' primaryAction' 
      helper.add_input(back) 

     reset = layout.Reset('reset', 'undo') 
     reset.field_classes += ' primaryAction' 
     helper.add_input(reset) 

     submit = layout.Submit('submit', 'Valider (here in french)') 
     submit.field_classes += ' primaryAction' 
     helper.add_input(submit) 

     helper.form_method = 'POST' 
     if hasattr(self, "action_url"): 
      helper.form_action = self.action_url 

     if hasattr(self, "form_style"): 
      helper.form_style = self.form_style 

     if hasattr(self, "form_layout"): 
      fs=[] 
      for name, fields in self.form_layout.iteritems(): 
       fs.append(layout.Fieldset(name, *fields)) 
      helper.add_layout(layout.Layout(*fs)) 
     else: 
      helper.add_layout(layout.Layout(layout.Fieldset("",*self.fields.keys()))) 
     return helper 

一個__init__方法,設置self.helper可能已經做的工作​​太多。 (但有時我使用表單進行簡單驗證而不進行渲染,因此我將它設置在屬性中)。

希望這會有所幫助