2012-11-03 27 views
5

私はクリスピーフォームとブートストラップを採用しようとしており、繰り返し何かを何度も発明するのではなく、可能な限り多くの機能を使用しています。django crispy-forms inline forms

django-adminフォームのように、クリスピーフォーム/ブートストラップでインラインフォーム機能を使用する方法はありますか?ここで

は一例です:

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') 

したがって、プロジェクトと名前/ URLのリンクと広告の方法があります多くの場合、django-adminで同じことが行われます。ここでは、メインモデルに関連するデータとともに余分な「行」を追加できます。下のスクリーンショットでは、QuestionOptionオブジェクトのデータを追加できる 'Question'オブジェクトのデータを記入することができます。必要な数のQuestionOptionsを追加するには '+'アイコンをクリックできます。

モデルから自動生成されたフォームを取得する方法を探しているわけではありません。いいですが、最も重要ではありません。データのようなデータの行を追加できるフォームを作成する方法はありますか? django-adminはどうしますか?

screenshot of django-admin

答えて

6

あなたが参照するインラインフォームは、DjangoでFormsetsとして知られています。書式セットについてもっと知りたい場合は、the Django forms documentationで見つけることができます。インラインフォームセットをレンダリング

クリスピーサポート、the section 'Rendering Formsets'

で説明したように、デフォルトでフォームセットを使用すると、さらに3つのオブジェクトを追加することができ、3余分なインラインフォームを表示しますのでご注意ください。保存した後、さらに3つの余分なインライン・フォームセットが追加されます。

Django管理者のように「追加」ボタンを追加するには、これらの行を動的に追加するためにJavascriptを使用する必要があります。

+0

この質問は動的な「追加」ボタンについて詳しく説明しています:http://stackoverflow.com/questions/501719/dynamically-adding-a-form-to-a-django-formset-with-ajax – publysher

0

クラスベースのビューを使用している場合は、django-extra-viewsを使用することができます。