2016-06-01 2 views
0

Я создал тэг select с четырьмя значениями параметров (1,2,3,4). Когда я выбираю 4 и нажимаю кнопку отправки, он возвращается обратно к опции 1.Выбор содержит количество продукта, необходимого для пользователя. Так как сохранить значение параметра после нажатия кнопки отправки. Я пробовал, как это, после того, как я нажимаю кнопку, значение кнопки возвращается к 1.Есть ли какой-либо способ преодолеть эту проблему?Как сохранить значение опции выбора после отправки в django?

Мой файл шаблона,

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

В файле шаблона я добавил эту строку,

{{form.as_p}} 

Теперь я получаю пустой вывод. Я думаю, что форма не распознается в шаблоне.

+4

Почему вы рендеринга 'выберите 'вручную вместо использования [Forms API] (https://docs.djangoproject.com/en/1.9/topics/forms/). Для вас это так. – solarissmoke

+0

Помимо вышесказанного, вы должны показать свое представление (или, по крайней мере, контекстные данные) – Sayse

+0

@solarissmoke Я обновил свой код, используя формы api.Can u point out моя ошибка? – Bhanukiran

ответ

2

Проблема здесь в том, что ваш шаблон просто показывает данные, он ничего не знает о состоянии. Поэтому, если вы хотите добиться такого поведения, вам необходимо предоставить все необходимые данные из бэкэнд. Также как указано @solarissmoke, вы должны использовать django forms.

для exmaple (Псевдокод ниже)

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

Вторая часть

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) 

Вы добавляете форму контекста внутри if request.method == 'POST'. Он хотел бы это

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

Я обновил свой код, используя формы api. Можете ли вы сказать мне, где ошибка. Форма не загружена в файл шаблона.так что я получаю пустой вывод – Bhanukiran

+0

@Bhanukiran см. сообщение, я обновил его –

+0

Теперь его рабочий – Bhanukiran

1

На ваш взгляд, вы только когда-либо добавить форму к данным контекста, если есть некоторое количество в почтовых данных, вы должны добавить это к контексту независимо, так как он необходим для зрения ,

Вы также должны использовать форму, чтобы вместо проверки данных сообщения проверить форму на достоверность, а затем использовать очищенные данные.

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' объект не итерацию

Возможно потому, что ваше поле сортировки не список кортежей

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

Я скопировал ваш код, теперь я получаю ошибку, поскольку объект «int» не является итерируемым, а django traceback указывает на эту строку, {{form.as_p}} – Bhanukiran

+0

Метод form.is_valid() не выполняется. – Bhanukiran

+0

@Bhanukiran - я обновил но это отдельная проблема, которая не связана с вашей фактической проблемой. – Sayse

Смежные вопросы