2016-05-27 16 views
0

Ich muss Formular so oft klonen wie ich will. Mein Ziel ist: Benutzer wählen, wie viele Aktien er benötigt, dann umleiten auf Seite mit der gleichen Anzahl von Formen (wahrscheinlich sollte ich etwas wie Ajax verwenden, aber für jetzt ist es zu schwer für mich). Herausgefunden, dass ich formset verwenden sollte. Denn jetzt habe ich Fehler ManagementForm data is missing or has been tampered withFehler bei der Verwendung von Django Formset

Mit django-datetime-widget und django-crispy-forms

forms.py:

from django import forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import * 
from crispy_forms.bootstrap import * 
from datetimewidget.widgets import DateWidget 

class InputDates(forms.Form): 
    Date_start = forms.DateField(widget=DateWidget(
     # attrs={'id':"datetimeid1"}, 
     usel10n = True, 
     bootstrap_version=3 
    ), 
     label='first date', 
     required=True, 
    ) 

    Date_end = forms.DateField(widget=DateWidget(
      # attrs={'id':"datetimeid2"}, 
      usel10n = True, 
      bootstrap_version=3 
     ), 
     label='last date', 
     required=True, 
    ) 

    Stock = forms.ChoiceField(
     choices=( ('GG', 'Google'), 
        ('APPL', 'Apple'), 
        ('SR', 'Smth1'), 
        ('GZ', 'Smth2'),), 
     required=True, 
     label='Choose your stock' 
    ) 

    def __init__(self, *args, **kwargs): 
     super(InputDates, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      Field('Stock'), 
      Field('Date_start'), 
      Field('Date_end'), 
     ) 

class BTN(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(BTN, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      ButtonHolder(
       Submit('submit', 'Make graph', css_class='btn btn-default') 
      ), 
     ) 

views.py:

from django.shortcuts import render 
from .forms import * 
from django.forms.formsets import formset_factory 

def stocks(request): 
    btn = BTN(request.POST or None) 
    StocksFormset = formset_factory(InputDates, extra=2) 
    if request.method == 'POST': 
     formset = StocksFormset(request.POST) 

     if formset.is_valid(): 
      return render(request, 'home.html') 

    else: 
     formset = StocksFormset() 

    return render(request, 'stocks.html', {'formset' : formset, 'BTN' : btn}) 

stocks.html:

{% extends "base.html" %} 
{% load staticfiles %} 
{% load crispy_forms_tags %} 

{% block content %} 

<form action="" method="post" class="text-left"> 
{% csrf_token %} 
    {{ formset.management_form }} 
    {% for form in formset %} 
      {% crispy form form.helper %} 
    {% endfor %} 
</form> 
    {% crispy BTN BTN.helper %} 

{% endblock %} 

In Django docs für formset ich fand, ich sollte {{ formset.management_form }} verwenden und alles wird gut, aber es funktioniert nicht für mich.

Antwort

0

Ich denke, das Problem ist mit der Art, wie Sie versuchen, die Formset-Formulare mit knackigen Formen zu rendern.

Insbesondere müssen Sie form_tag-False im Helfer setzen, wie sie derzeit wird es einen separaten <form> Tag für jede Form in dem Satz zu machen, die den Browser gründlich verwirren:

class InputDates(forms.Form): 
    # ... 

    def __init__(self, *args, **kwargs): 
     super(InputDates, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_tag = False 

Sie auch benötigen Setzen Sie form_tag auf False auf dem BTN Formularhelfer, da Sie das <form> Tag manuell rendern.

Hier ist der relevant part of the documentation:

Ihrer Ansicht nach müssen Sie das Layout ändern oder eine andere Hilfe für jede Form des formset verwenden. Stellen Sie sicher, dass Sie das Attribut form_tag auf False gesetzt haben, sonst erhalten Sie 3 individuelle Formulare.

Verwandte Themen