Django mehrere Forms abschicken?

Django, Flask, Bottle, WSGI, CGI…
Antworten
ApplepieThon
User
Beiträge: 6
Registriert: Mittwoch 2. Mai 2018, 14:43

Hallo Zusammen,

ich versuche gerade eine Seite zu bauen die es meinen Usern erlaubt ein Angebot zu erstellen, jedes Angebot zusätzlich ein oder mehrere Angebotsposten (Item). Beide Models haben ihre eigene Form und der User muss auch beide Forms in der Seite ausfüllen.

Bisher bin ich zumindest soweit gekommen das man beide Formulare ausfüllen und abschicken kann, nur geht es ab da den Bach runter, weil der Submit-Button mich danach zu einer "Page not working" Seite weiterleitet und nichts mehr passiert. Ich hab leider keine Ahnung warum das passiert, wüsste hier jemand vielleicht eine Lösung / Grund?

Mein Code:

Views.py

Code: Alles auswählen

class OfferCreateView(TemplateView):
    def dispatch(self, request, *args, **kwargs):
        return super(OfferCreateView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.last_modified_by = self.request.user
        self.object.save()
        form.save_m2m()
        return redirect(self.object.get_absolute_url())

    model = Offer
    template_name = 'offers/offer_create.html'
    form_class = OfferCreateForm

    def get(self, request, *args, **kwargs):
        form = OfferCreateForm(self.request.GET or None)
        item_form = ItemCreateForm(self.request.GET or None)
        context = self.get_context_data(**kwargs)
        context['form'] = form
        context['item_form'] = item_form
        return self.render_to_response(context)
und mein HTML:

Code: Alles auswählen

{% block content %}
    <div class="box box-solid box-default">
        <div class="box-header with-border">
            <h3 class="box-title">Neues Angebot erstellen</h3>
        </div>
        <form method="post" action="" class="form">{% csrf_token %}
            <div class="box-body">
                <fieldset>
                    <legend>Information {% icon 'fa-info-circle' %}</legend>
                    <p>
                        Bitte alle Felder mit den nötigen Informationen ausfüllen. Die restlichen Daten werden automatisch
                        von MESS erzeugt. Eine PDF kann im Anschluss in der Detailansicht erzeugt werden.
                    </p>
                </fieldset>
                {% crispy form %}

                <fieldset>
                    <legend>Angebotsposten</legend>
                    <p>
                        Hier werden die Angebotsposten für das Angebot erstellt.
                    </p>
                </fieldset>
                <div class='table'>
                    {% crispy item_form %}
                </div>
                <input type="button" value="Add More" id="add_more">
                <script>
                    $('#add_more').click(function() {
                        cloneMore('div.table:last', 'service');
                    });
                </script>
            </div>
            <div class="box-footer">
                <div class="form-actions">
                    <a class="btn btn-default btn-flat" href="{% url 'offers:offers-list' %}">Abbrechen</a>
                    <input type="submit" class="btn btn-primary btn-flat pull-right" value='Anlegen'>
                </div>
            </div>
        </form>
    </div>
{% endblock %}
Wäre sehr dankbar wenn mir da jemand helfen könnte!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Du kannst zeitgleich nur eine Form absenden. Zudem solltest Du statt TemplateView die FormViews der class-based generic-views nutzen.
ApplepieThon
User
Beiträge: 6
Registriert: Mittwoch 2. Mai 2018, 14:43

Ja aber irgendwie sollte es doch möglich sein mehrere Forms abzuschicken? Ich meine ich bin ja sicherlich nicht der erste der sowas probiert :?

Und ja die TemplateView war wirklich falsch :D Ich hab mal meine View etwas upgedated:

Code: Alles auswählen

class OfferCreateView(CreateView):
    model = Offer
    template_name = 'offers/offer_create.html'
    form_class = OfferCreateForm

    def dispatch(self, request, *args, **kwargs):
        return super(OfferCreateView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.last_modified_by = self.request.user
        self.object.save()
        form.save_m2m()
        return redirect(self.object.get_absolute_url())

    def get(self, request, *args, **kwargs):
        form = OfferCreateForm(request=request)
        itemformset = formset_factory(ItemCreateForm)
        item_form = itemformset()
        return self.render_to_response({
            "form": form,
            "item_form": item_form
        })[code]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es geht halt nicht. HTTP sieht es nicht vor. Und wie stellst du dir das auch vor? Zwei actions auf verschiedene Endpunkte sollen dann wie zu einem Ergebnis werden?

Was du natürlich tun kannst ist, alle Felder in ein großes Form zu packen.
ApplepieThon
User
Beiträge: 6
Registriert: Mittwoch 2. Mai 2018, 14:43

Naja das mach ich doch? :) Also ich hole ja in meinem HTML zwischen den zwei <form> Tags die Crispy Forms und packe die dann dort rein. Sollte doch so gehen, oder hab ich da was falsch verstanden?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie sieht denn das resultierende HTML aus? Wenn dieses crispy (kenne Django nur oberflächlich, immer mit was anderem gearbeitet ) auch eigene Form Tags rendert –dann geht’s nicht.
Antworten