2016-02-20 2 views
1

У меня возникла проблема с формами django. В настоящее время я использую request.POST для проверки POST в представлениях. Я хочу немного отделить вещи, переместив весь процесс на формы.Django формы. Поля с тем же атрибутом имени html

Что я буду делать:
Пользователь предоставлен с 5 текстами ввода. И он может добавить до 30 текстов, используя javascript. Каждый входной текст имеет атрибут name = 'choice []'. Поэтому, когда я получаю запрос. POST dict, я просто делаю:

choices = request.POST.getlist('choices[]') 

и я получаю все возможности пользователя.

Как это можно реализовать с формами django?
Например, следующая форма:

class MyForm(forms.Form): 

    # Form fields 
    title = forms.CharField() 
    choice1 = forms.CharField() 
    choice2 = forms.CharField() 
    option = forms.ChoiceField(choices=(...)) 

будет производить что-то подобное в HTML:

<input name="title" type="text" /> 
<input name="choice1" type="text" /> 
<input name="choice2" type="text" /> 
<select name="option"> 
    <option .... /> 
     .... 
</select> 

можно ли сделать его производить следующее без вручную жестко прописывать его в HTML файл сам ?:

<input name="title" type="text" /> 
<input name="choices[]" type="text" /> 
<input name="choices[]" type="text" /> 
<select name="option"> 
    <option .... /> 
     .... 
</select> 

, и если да, то как я могу обработать проверку после этого?

Спасибо

P.S Я прочитал документацию о Джанго FormSets, но речь идет о создании нескольких форм, а не 1 форму, так что я не думаю, что это будет никакой пользы.

+0

Снова прочитайте документы 'formet'. Это то, что вам нужно. 'Formset' - это набор' forms', это не только одна 'форма '. – Todor

+0

Uhm ok Я избегал упоминать, что вся форма состоит из большего количества элементов, а не только выбора. Если я предоставил дополнительный = 3, он предоставит 3 дополнительные формы, тогда как я хочу только 3 дополнительных поля выбора. Я что-то упускаю? Также это решение проблемы с именем? – tchar

+0

Вы можете разделить проблему на части и решить их один за другим (делить и побеждать), проверить мой ответ. – Todor

ответ

0

Вы можете использовать обычный form для остальной части fields и formset для choices.

#in your forms.py 
from django import forms 
class MyMainForm(forms.Form): 
    title = forms.CharField() 

class MyChoicesForm(forms.Form): 
    choice = forms.CharField() 

MyChoicesFormset = forms.formset_factory(MyChoicesForm) 

#in your views.py 
def my_manage_view(request): 
    if request.method == 'POST': 
     form = MyMainForm(request.POST) 
     formset = MyChoicesForm(request.POST) 
     if form.is_valid() and formset.is_valid(): 
      # do something with the form and formset.cleaned_data 
      pass 
    else: 
     form = MyMainForm() 
     formset = MyChoicesForm() 
    return render(request, 'my_manage_view.html', { 
     'form': form, 
     'formset': formset 
    }) 


#in your template you can render them inside one <form> tag 
<form method="post" action=""> 
    {{ form }} 
    <table> 
     {{ formset }} 
    </table> 
</form> 
Смежные вопросы