2015-03-07 5 views
5

Chciałbym renderować każdą formę zestawu formularzy w różnych zakładkach bootstrap3 za pomocą django-crispyForms, ale wydaje się to nie być proste, ponieważ funkcja crispyForms nie obsługuje kompletnego zestawu jeszcze.Django CrispyForms - Renderowanie każdej formy zestawu w osobnych zakładkach ładowania początkowego

enter image description here

moja forma:

class BlogMessageForm(forms.ModelForm): 
    class Meta: 
     model = BlogMessage 
     fields = ['field1', 'field2', ] 

class BlogMessageFormsetHelper(FormHelper): 
    def __init__(self, *args, **kwargs): 
     super(BlogMessageFormsetHelper, self).__init__(*args, **kwargs) 
     self.form_tag = False 
     self.layout = Layout(
      TabHolder(
       Tab('Form%s' % (form.pk), 
        'field1', 'field2', 'DELETE', 
        ) 
      ) 

     ) 

mój widok:

def all_blogs_messages_in_bootstrap_tab(request): 
    all_blog_messages = BlogMessage.objects.all() 
    blogMessageForm = modelformset_factory(BlogMessage, form=BlogMessageForm, extra=1, can_delete=True) 
    formset = blogMessageForm(queryset=all_blog_messages) 
    helper = BlogMessageFormHelper() 

    render_to_response("blogs/blogMessage_forms.html", {'formset': formset, 'helper': helper}, context_instance=RequestContext(request)) 

mój szablon crispyForms:

{% load crispy_forms_tags %} 
<form method="post" action="" encrypt="multipart/form-data">{% csrf_token %} 
    {% crispy formset helper %} 
</form> 

Tam jest kilka informacji o tym crispyForm formset contraint:

+0

prostu pętli formularzy w formset i nazywają crisy użytkownika zamiast tego użyj renderera. wystarczy zawinąć/stworzyć kod kart wewnątrz forloopa. –

+0

tak, byłoby wspaniale mieć chrupiący szablon. Jeśli ktoś może stworzyć taki szablon, otworzę nagrodę za to jutro. –

Odpowiedz

6

Oto jak zrobiłbym to:

<form method="post" enctype="multipart/form-data">{% csrf_token %} 
    {{ formset.management_form }} 
    <div role="tabpanel"> 
    <ul class="nav nav-tabs" role="tablist"> 
     {% for form in formset %} 
     <li role="presentation" class="{% if forloop.first %}active{% endif %}"> 
      <a href="#id_form-{{ forloop.counter0 }}" aria-controls="id_form-{{ forloop.counter0 }}" role="tab" data-toggle="tab"> 
      {% if forloop.counter0 < formset.initial_forms|length %} 
       Form{{ forloop.counter }} 
      {% else %} 
       New Form 
      {% endif %} 
      </a> 
     </li> 
     {% endfor %} 
    </ul> 
    <div class="tab-content"> 
     {% for form in formset %} 
     <div role="tabpanel" class="tab-pane{% if forloop.first %} active{% endif %}" id="id_form-{{ forloop.counter0 }}"> 
      {% crispy form %} 
      {% if form.instance.pk %} 
      <input id="id_form-{{ forloop.counter0 }}-id" name="form-{{ forloop.counter0 }}-id" type="hidden" value="{{ form.instance.id }}"> 
      {% endif %} 
      {% if forloop.counter0 < formset.initial_forms|length %} 
      {% if formset.can_delete %} 
       <input id="id_form-{{ forloop.counter0 }}-DELETE" name="form-{{ forloop.counter0 }}-DELETE" type="hidden"> 
       <button type="submit" data-id="id_form-{{ forloop.counter0 }}-DELETE" class="btn btn-default btn-formset-delete">Delete</button> 
      {% endif %} 
      {% endif %} 
     </div> 
     {% endfor %} 
    </div> 
    </div> 
    <button type="submit" class="btn btn-primary">Save</button> 
</form> 

Prawie zapomniałem, przycisk usuwania nie będzie działał bez niektórych javascript. Ale to jest opcjonalne oczywiście delete pole może być widoczne i usunięto przycisk, inaczej:

$(document).ready(function(){ 
    $(".btn-formset-delete").click(function(){ 
     $("#" + $(this).data('id')).val("on"); 
     return true; 
    }); 
}); 

dodaj to również do postaci:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.helper = FormHelper(self) 
    self.helper.form_tag = False 
    self.helper.disable_csrf = True 
+0

Świetna robota Alexey! Jedyna rzecz jest jednak taka, że ​​ukryte dane wejściowe "form-0-id" nie są dodawane w każdej formie zestawu, więc nie mogę ich zapisać. Czy masz pomysł, dlaczego? –

+0

Wprowadziłem małe dostosowanie, które powinno rozwiązać problem. Daj mi znać, jeśli to pole wciąż się nie wyświetla. –

+0

ok Myślę, że możesz po prostu wstawić ukryte dane identyfikacyjne formularza w {% if form.instance%}? Nie rozumiem jednak, dlaczego dane wejściowe nie są automatycznie dodawane do wszystkich innych formularzy. –

Powiązane problemy