1

私は、フォームとフォームセット(訪問とVisitService)にクリスピーなフォームを設定しようとしています。ヘルパーをdjangoに渡すことができませんCrispy Formset in template

どのようにしても、フォームセットにヘルパーをつけることができません。 私は、フォームセットに属性としてヘルパーを追加して表示し、コンテキストにヘルパーを追加しましたが、それは私に次のエラーを与え続け:

VariableDoesNotExist - キー[ヘルパー]で失敗したルックアップ は(も[helper_attribute]試してみました)

ここ

は、私が使用しているものです:

forms.py:

class VisitForm(forms.ModelForm): 
    class Meta: 
     model = models.Visit 
     fields = [ 
      [...all visit fields go here...] 
     ] 
    def __init__(self, *args, **kwargs): 
     super(VisitForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper(self) 
     self.helper.layout = Layout(
[...fields go here...] 

      ), 
      ButtonHolder(
       Submit('submit', 'Submit', css_class='button white btn-wide') 
      ) 
     ) 
class VisitServiceForm(forms.ModelForm): 
    class Meta: 
     model = models.VisitService 
     fields = [ 
      'service', 
      'unit', 
     ] 

    def __init__(self, *args, **kwargs): 
     super(VisitServiceForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      Row(
       Div(Field('service'),css_class='col-sm-4'), 
       Div(Field('unit'),css_class='col-sm-4'), 
     ) 
VisitServiceFormSet = forms.modelformset_factory(
    models.VisitService, 
    form=VisitServiceForm, 
    extra=2, 
) 
VisitServiceInlineFormSet = forms.inlineformset_factory(
    models.Visit, 
    models.VisitService, 
    extra=5, 
    fields=('service', 'unit'), 
    formset=VisitServiceFormSet, 
    min_num=1, 
) 

views.py:

def create_visit(request, patient_pk): 
    patient = get_object_or_404(models.Patient, pk=patient_pk) 
    form_class = forms.VisitForm 
    form = form_class() 
    visitservice_forms = forms.VisitServiceInlineFormSet(
     queryset=models.VisitService.objects.none() 
    ) 
    helper = forms.VisitServiceForm() 

    if request.method == 'POST': 
     form = form_class(request.POST) 
     visitservice_forms = forms.VisitServiceInlineFormSet(
      request.POST, 
      queryset=models.VisitService.objects.none() 
     ) 
     if form.is_valid() and visitservice_forms.is_valid(): 
      visit = form.save(commit=False) 
      visit.patient = patient 
      visit.save() 
      visitservices = visitservice_forms.save(commit=False) 
      for visitservice in visitservices: 
       visitservice.visit = visit 
       visitservice.save() 
      messages.success(request, "Added visit") 
      return HttpResponseRedirect(visit.get_absolute_url()) 

    return render(request, 'fpform/visit_form.html', { 
      'patient': patient, 
      'form': form, 
      'formset': visitservice_forms, 
      'helper': helper, 
    }) 

テンプレート:

<div class="container"> 
    <form method="POST" action=""> 
     {% crispy form %} 
     {% crispy formset formset.form.helper_attribute %} 
     </div> 
    </form> 

私も運とは別に、これらのそれぞれを使用していた私のテンプレートで:

{% crispy formset formset.form.helper %} 
{% crispy formset helper_attribute %} 
{% crispy formset helper %} 
{% crispy formset form.helper_attribute %} 
{% crispy formset form.helper %} 

私はサクサクのドキュメントを見たが、答えを見つけることができませんでしたそこ。

これに一日を費やしましたが、どこにも行きませんでした。また、これを達成するためのよりよい方法があるかどうか、私に知らせてください。

答えて

0

フォームセットのレイアウトを定義するには、独立したFormHelperクラスを作成してフォームに渡す必要があります。

http://django-crispy-forms.readthedocs.io/en/latest/crispy_tag_formsets.html

# forms.py 
class VisitServiceFormHelper(FormHelper): 
    def __init__(self, *args, **kwargs): 
     super(VisitServiceFormHelper, self).__init__(*args, **kwargs) 
     self.layout = Layout(
      Div(Field('service'),css_class='col-sm-4'), 
      Div(Field('unit'),css_class='col-sm-4'), 
     ) 

#views.py 
formset = VisitServiceInlineFormSet(queryset=VisitService.objects.none()) 
helper = VisitServiceFormHelper() 
return render(request, 'template.html', {'formset': formset, 'helper': helper}) 

#template 
{% crispy formset helper %} 
関連する問題