2016-06-01 3 views
0

Ich habe Select-Tag mit vier Option Werte (1,2,3,4) erstellt. Wenn ich 4 und drücken Sie auf Senden, ändert sich zurück zu 1.Wählen Sie Option enthält Menge des Produkts für den Benutzer benötigt.So wie zu behalten Optionswert nach dem Drücken der Schaltfläche "Senden". Ich habe es so versucht, nachdem ich die Schaltfläche "Senden" gedrückt habe, wird der Wert wieder auf "1" zurückgesetzt. Gibt es eine Möglichkeit, dieses Problem zu lösen?Wie behält man den ausgewählten Optionswert nach dem Senden in django?

Meine Template-Datei,

<label for="quantity">Quantity</label> 
      <select id="quantity" name="quantity"> 
       <option value="1" {% if quantity == '1' %}selected{% endif %}>1</option> 
       <option value="2" {% if quantity == '2' %}selected{% endif %}>2</option> 
       <option value="3" {% if quantity == '3' %}selected{% endif %}>3</option> 
       <option value="4" {% if quantity == '4' %}selected{% endif %}>4</option> 
      </select> 
<input type="submit" value="Buy"/> 

UPDATE: forms.py,

class SortForm(forms.Form): 
    RELEVANCE_CHOICES = (
        (1,'1'),(2, '2'),(3,'3'), (4,'4'),(5,'5'), 
    ) 
    sort = forms.ChoiceField(choices = RELEVANCE_CHOICES,label='Quantity') 

views.py,

from .forms import SortForm 
@csrf_protect 
def buy_book(request,pk): 
    form = SortForm(request.POST or None) 
    my_products = Add_prod.objects.filter(pk=pk) 
    #Add_prod is the model class name 
    context = {"products":my_products} 

    if request.POST.get('quantity'): 
     for i in my_products: 
      rate= i.price 
     #price is the column name in the model class 
     u_quantity = request.POST.get('quantity') 
     Quantity=int(u_quantity) 
     total = rate*Quantity 
     context = {  
       "products":my_products, 
       "Total":total, 
       "form": form   
     }  
    return render(request,"buy_book.html",context) 

In der Vorlagendatei ich diese Zeile hinzugefügt,

{{form.as_p}} 

Jetzt bekomme ich leere Ausgabe. Ich denke, das Formular erkennt nicht in der Vorlage.

+4

Warum ist rendern Sie die 'wählen 'manuell anstelle der Verwendung der [Forms API] (https://docs.djangoproject.com/en/1.9/topics/forms/). Es macht so etwas für dich. – solarissmoke

+0

Abgesehen von den oben genannten, sollten Sie Ihre Ansicht (oder zumindest die Kontextdaten) zeigen – Sayse

+0

@solarissmoke Ich aktualisierte meinen Code mit Formen api.Kann ich Sie auf meinen Fehler hinweisen? – Bhanukiran

Antwort

2

Das Problem hier, dass Ihre Vorlage nur Daten zeigt, weiß es nichts über Zustand. Wenn Sie dieses Verhalten erreichen möchten, müssen Sie alle erforderlichen Daten aus dem Backend bereitstellen. Auch als @solarissmoke erwähnt sollten Sie django forms verwenden.

für exmaple (Pseudo-Code unten)

def my_view(request): 
    if request.method == 'POST': 
     form = MyForm(request.data) 
     if form.is_valid(): 
      form.save() 
      redirect(reverse('myview')) 
    else: 
     form = MyForm(instance) # <- instance is object with previously saved data 
    return render(request, 'my_template.html' , {'form': form}) 

Zweiter Teil

def buy_book(request,pk): 
    form = SortForm(request.POST or None) 
    my_products = Add_prod.objects.filter(pk=pk) 
    #Add_prod is the model class name 
    context = {"products":my_products} 

    if request.POST.get('quantity'): 
     for i in my_products: 
      rate= i.price 
     #price is the column name in the model class 
     u_quantity = request.POST.get('quantity') 
     Quantity=int(u_quantity) 
     total = rate*Quantity 
     context = {  
      "products":my_products, 
      "Total":total, 
      "form": form  # <- here is problem 
     }  
    return render(request,"buy_book.html",context) 

Sie fügen Formular Kontext innerhalb if request.method == 'POST'. Es sollte so

def buy_book(request,pk): 
    form = SortForm(request.POST or None) 
    my_products = Add_prod.objects.filter(pk=pk) 
    #Add_prod is the model class name 
    context = {"products":my_products, 'form': form} # <- here 

    if request.POST.get('quantity'): 
     for i in my_products: 
      rate= i.price 
     #price is the column name in the model class 
     u_quantity = request.POST.get('quantity') 
     Quantity=int(u_quantity) 
     total = rate*Quantity 
     context = {  
      "products":my_products, 
      "Total":total, 
     }  
    return render(request,"buy_book.html",context) 
+0

Ich habe meinen Code mit forms api aktualisiert. Kannst du mir sagen, wo der Fehler liegt? Form ist nicht in meiner Vorlagendatei geladen.so bekomme ich leere Ausgabe – Bhanukiran

+0

@Bhanukiuran siehe Beitrag, ich aktualisierte es –

+0

Danke jetzt seine Arbeit – Bhanukiran

1

Ihrer Meinung Sie immer nur die Form der Kontextdaten hinzufügen, wenn es eine Menge in den Post-Daten ist, können Sie dies in den Kontext hinzufügen sollten unabhängig, da sie für Ihre Zwecke erforderlich ist .

Sie sollten auch eigentlich verwenden Sie das Formular, so überprüfen Sie anstelle der Post-Daten das Formular für die Gültigkeit und verwenden Sie dann seine bereinigten Daten.

def buy_book(request,pk): 
    form = SortForm(request.POST or None) 
    my_products = Add_prod.objects.filter(pk=pk) 
    #Add_prod is the model class name 
    context = {"products":my_products, 
       'form': form} 

    if form.is_valid(): 
     for i in my_products: 
      rate= i.price 
     #price is the column name in the model class 
     u_quantity = form.cleaned_data.get('sort', 0) 
     Quantity=int(u_quantity) 
     total = rate*Quantity 
     context['total'] = total 
    return render(request,"buy_book.html",context) 

'int' Objekt ist nicht iterable

Wahrscheinlich, weil Ihr Sortierfeld nicht eine Liste von Tupeln

choices = [(i, i) for i in range(1,6)] 
+0

Ich kopierte Ihre Code, jetzt bekomme ich Fehler als 'int' Objekt ist nicht iterierbar und django Traceback zeigt auf diese Zeile, {{form.as_p}} – Bhanukiran

+0

form.is_valid() Methode wird nicht ausgeführt – Bhanukiran

+0

@Bhanukiuran - Ich habe aktualisiert aber das ist ein separates Problem, das nicht auf Ihr tatsächliches Problem bezogen ist – Sayse

Verwandte Themen