2017-08-20 2 views
0

Ich bin neu in Django und ich habe eine Menge Probleme mit den Formularen.Django: Wie mehrere "fügen Sie ein weiteres Feld" Schaltflächen in einem Formular haben

Ich mache eine Berechnung-basierte Tool und ich muss in der Lage sein, eine beliebige Anzahl von Eingaben zu haben.

Als ein wirklich einfaches Beispiel, sagen wir mal, ich möchte einen Rechner erstellen, der eine beliebige Anzahl von Eingaben summiert und subtrahiert. Jede hinzuzufügende oder zu subtrahierende Zahl befindet sich in einem eigenen Nummernfeld. Sowohl die Liste der "addierenden" Felder als auch die Liste der "subtrahierenden" Felder hat ihre eigene "addiere andere Feld" Taste.

Für den Anfang, hier ist etwas, das zwei Eingaben hinzufügt (da ich nicht herausfinden, wie man sogar 1 "addieren Sie eine weitere Feldtaste" oder verstehen Sie die answer to it).

views.py

from __future__ import unicode_literals 

from django.http import HttpResponse, HttpResponseRedirect 

from django.shortcuts import render 
from django.views.decorators.csrf import csrf_exempt 

from .forms import AddForm 


def _from_str(s): 
    try: 
     s = int(s) 
    except ValueError: 
     try: 
      s = float(s) 
     except ValueError: 
      pass 
    return s 


@csrf_exempt 
def web_adder(request): 
    if request.method == 'POST': 
     form = AddForm(request.POST) 
     # form = MyForm(request.POST, extra=request.POST.get('extra_field_count')) 
     if form.is_valid(): 
      return web_adder_out(request, _from_str(form.cleaned_data['addend0']), _from_str(form.cleaned_data['addend1'])) 

    else: 
     form = AddForm() 
     # form = MyForm() 
    return render(request, 'addercontent.html', {'form': form}) 


def web_adder_out(request, a, b): 
    return render(request, 'addercontentout.html', {'content':[a + b]}) 

forms.py

from django import forms 


class AddForm(forms.Form): 
    addend0 = forms.CharField(label='first addend', max_length=100) 
    addend1 = forms.CharField(label='second addend', max_length=100) 

addercontent.html

{% block content %} 
<p>This is a web adder</p> 
<form action="" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" class="btn btn-default">Enter</button> 
</form> 
{% endblock %} 

addercontentout.html

{% block content %} 
    {% for c in content%} 
    Result: {{c}} 
    <br> 
    <a href="/" class="btn btn-default">Return</a> 
    {% endfor %} 
{% endblock %} 
+0

Warum verwenden Sie '{% csrf_token%}', wenn Sie 'csrf_exempt' Decorator setzen? – ShadowXsc

+0

Weil ich keine Ahnung habe was ich mache. Ich werde es entfernen. – Zoojay

Antwort

0

So ähnlich? (Nicht getestet, ich habe implementieren nicht hinzufügen Schaltfläche)

forms.py

class CalcForm(forms.Form) 
    first = forms.IntegerField() 
    second = forms.IntegerField() 

     def add(self): 
      first = self.cleaned_data['first'] 
      second = self.cleaned_data['second'] 
      return first + second 

views.py

def index(request): 
    if request.method == "POST": 
     form = CalcForm(request.POST) 
     if form.is_valid(): 
      result = form.add() 
      return render(request, 'your_result_template.html', {'result': result}) 
    else: 
     form = CalcForm() 
    return render(request, 'your_template.html', {'form': form}) 

your_template.html

{% block content %} 
    <p>This is a web adder</p> 
    <form method="post"> 
     {% csrf_token %} 
     {{ form.as_p }} 
     <button type="submit" class="btn btn-default">Enter</button> 
    </form> 
{% endblock %} 

your_result_template.html

{% block content %} 
    <p>Sum:</p> 
    <h2>{{ result }}</h2> 
{% endblock %} 

Edit: Für Felderzeugung Sie Javascript benötigen. Ich weiß nicht, warum Sie Django für diese Art von App verwenden möchten.

0

Verwenden Sie Django nicht für die Feldgenerierung. Ich würde alles über HTML machen. Führen Sie Ihr Setup aus, das Sie derzeit haben, und Sie sollten in der Lage sein, die Seitenquelle zu sehen, um zu sehen, wie die Eingaben strukturiert sind. Dann können Sie das Formular manuell in HTML schreiben, wobei JavaScript nach Bedarf Felder hinzufügt.

Verwandte Themen