2015-03-07 8 views
5

Vorrei rendere ogni form di un formset in una diversa scheda bootstrap3 usando django-crispyForms, ma non sembra semplice perché crispyForms non gestisce completamente il formset ancora.Django CrispyForms - Rendering di ogni forma di un formset in schede di bootstrap separate

enter image description here

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

     ) 

mio punto di vista:

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

mio modello crispyForms:

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

Eccola alcune informazioni su che contraint crispyForm formset:

+0

proprio ciclo attraverso le forme del formset e chiamare Crisy di modulo di rendering invece. hai solo bisogno di avvolgere/creare il codice delle schede all'interno di forloop. –

+0

sì, sarebbe bello avere un modello croccante per farlo. Se qualcuno può creare tale modello, aprirò un premio per quello domani. –

risposta

6

Ecco come lo farei:

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

Quasi dimenticato, il pulsante Elimina non funzionerà senza alcuni javascript. Ma questo è facoltativa, naturalmente, delete campo può essere reso visibile e il pulsante rimosso, altrimenti:

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

aggiungere anche questo al modulo:

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

Ottimo lavoro Alexey! L'unica cosa tuttavia è che l'input nascosto 'form-0-id' non viene aggiunto in ogni form del formset, quindi non posso salvare. Hai un'idea del perché? –

+0

Ho apportato una piccola modifica che dovrebbe risolvere il problema. Fammi sapere se quel campo continua a non apparire. –

+0

ok Penso che potresti inserire l'input dell'ID di modulo nascosto in un {% if form.instance%}? Tuttavia, non capisco perché questo input non venga aggiunto automaticamente con tutti gli altri moduli –

Problemi correlati