2012-11-03 114 views
5

我試圖採用脆皮形式和引導,並儘可能多地使用它們的功能,而不是一遍又一遍地發明一些東西。django脆皮形式內聯形式

有沒有一種方法可以像django-admin表單一樣使用內嵌表單功能來創建像crispy-forms/bootstrap這樣的表單?

下面是一個例子:

class NewProjectForm(forms.Form): 
    name = forms.CharField(required=True, label=_(u'Название проекта'), widget=forms.TextInput(attrs={'class':'input-block-level'})) 
    group = forms.ModelChoiceField(required=False, queryset=Group.objects.all(), label=_(u'Группа проектов'), widget=forms.Select(attrs={'class':'input-block-level'})) 
    description = forms.CharField(required=False, label=_(u'Описание проекта'), widget=forms.Textarea(attrs={'class':'input-block-level'})) 

    class Meta: 
     model = Project 
     fields = ('name','description','group') 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.form_class = 'horizontal-form' 
     self.helper.form_action = 'submit_new_project' 
     self.helper.layout = Layout(
      Field('name', css_class='input-block-level'), 
      Field('group', css_class='input-block-level'), 
      Field('description',css_class='input-block-level'), 
     ) 
     self.helper.add_input(Submit('submit',_(u'Создать проект'))) 
     self.helper.add_input(Submit('cancel',_(u'Я передумал'))) 
     super(NewProjectForm, self).__init__(*args, **kwargs) 

它會顯示一個體面的形式:

example of single form rendered with crispy-forms

如何去補充說,基本上代表了這種模式的一種形式:

class Link(models.Model): 
    name = models.CharField(max_length=255, blank=False, null=False, verbose_name=_(u'Название')) 
    url = models.URLField(blank=False, null=False, verbose_name=_(u'Ссылка')) 
    project = models.ForeignKey('Project') 

所以會有一個項目和名稱/網址鏈接和廣告的方式d很多,就像在django-admin中做的一樣,你可以在其中添加額外的'行'和與你的主模型相關的數據。在下面的屏幕截圖中,您可以填寫「問題」對象的數據,並且在下面您可以爲QuestionOption對象添加數據 - 您可以單擊「+」圖標以添加儘可能多的QuestionOptions。

我不是在尋找一種方式來從模型中獲取自動生成的表單(這很好,但不是最重要的) - 有沒有一種方法來構建一個表單,可以讓你添加'行'數據django-admin呢?

screenshot of django-admin

回答

6

您引用的內聯表單在Django中稱爲Formsets。如果你想更多地瞭解formset,你可以在the Django forms documentation找到它們。

脆皮支持呈現內聯表單集,如the section 'Rendering Formsets'

說明請注意,在默認情況下顯示3種額外的直列形式表單集,允許您添加三個對象。保存後,您再次獲得三個額外的內聯窗體集,以添加更多內容。

如果您想在Django Admin中添加一個'添加更多'按鈕,您將需要使用一些Javascript動態添加這些行。

+0

這個問題更詳細地介紹了動態「添加更多」按鈕:http://stackoverflow.com/questions/501719/dynamically-adding-a-form-to-a-django-formset-with-ajax – publysher