2012-05-01 70 views
14

我期待一些結構添加到我的客戶端代碼,並一直在閱讀有關knockout.js。我一直在閱讀文檔,並有一個簡單的問題要問 - 因爲淘汰賽要求用戶添加一個data-bind屬性到html元素,什麼是它與django形式一起使用的最佳方式,因爲目前我正在使用{{ form.as_p }}與django形式使用knockout.js?

我很好奇如何以及在何處,我應該形成的輸入到view model(如果它是在Django的表單字段,或福費廷{{ form.as_p }}和HTML類型了吧。

回答

19

您可以添加自定義屬性在你的領域形式的元定義與小部件。

class SomeForm(forms.ModelForm): 
    class Meta: 
     model = SomeModel 
     widgets = {'field_name1': forms.Textarea(attrs={'data-bind':'value: field1'}), 
        'field_name2': forms.TextInput(attrs={'data-bind':'value: field2'})} 

例如,第一場將呈現:

<textarea id="id_field_name1" name="field_name1" data-bind="value: field1"></textarea> 

更新: 這裏獎金是一個簡單的方法來改變每個字段屬性的形式,例如,如果他們都需要特定類的(其他的js插件或CSS樣式有用)

def __init__(self, *args, **kwargs): 
     super(SomeForm, self).__init__(*args, **kwargs) 
     for name, field in self.fields.items(): 
      field.widget.attrs['class'] = 'some_form_field' 
      # this could be used in your case if the Django field name is the 
      # same as the KO.js field name 
      field.widget.attrs['data-bind'] = 'value: %s' % name 
1

的另一種方法是使用django-crispy-forms並在layout限定data-bind屬性:

def __init__(self, *args, **kwargs): 
    super(SomeForm, self).__init__(*args, **kwargs) 
    self.helper = FormHelper() 
    self.helper.layout = Layout(
     Div('field_1', 
      Field('field_2', data_bind='value: field_2')), 
     HTML("{% if success %} <p data-bind="css: { success: success_flag }">Operation was successful</p> {% endif %}"), 
    ) 

然後在模板中,你只能做:

{% crispy form form.helper %} 

瞧。

Cripsy形式比那更強大,並允許您定義自己的layout templates等。