如果页面上有多个表单而没有提交按钮Django 1.10,如何传递表单ID?

时间:2017-03-20 17:21:55

标签: python django django-forms django-views

我有一个包含问题列表的页面。他们每个都有单选按钮形式,"是","可能","否"一种选择。此表单通过做出选择提交。 http://prntscr.com/embo1m

我无法理解如何将问题ID与其形式联系起来。如何通过回复获得它的观点?

models.py

class Answer(models.Model):
    user = models.ForeignKey(User)
    apartment = models.ForeignKey(Apartment)
    question = models.ForeignKey(Question)
    choice = models.IntegerField(default=2)

def __str__(self):
    return str(self.choice)

views.py

def questions_list(request, apartment_pk):
    context = {}
    context['apartment'] = get_object_or_404(Apartment, pk=apartment_pk)
    context['questions'] = get_list_or_404(Question)
    context['answer_form'] = AnswerForm
    context['username'] = auth.get_user(request).username
    if request.method == 'POST':
        form = AnswerForm(request.POST or None)
        if form.is_valid():
            print(form.cleaned_data)
    return render(request, 'main/questions.html', context)

forms.py

class AnswerForm(ModelForm):
    choice = ChoiceField(label='', widget=RadioSelect, choices=ANSWERS)
    question_id = CharField(widget=HiddenInput(), required=False)
    class Meta:
        model = Answer
        fields = ('choice', 'question_id')

模板

<h1>{{ apartment.title }}</h1>
{% for question in questions %}
<h3>{{ question.title }}</h3>
<form id="question_{{ question.id }}" name="question_{{ question.id }}" action="/apartments/{{ apartment.id }}/" method="post">
    {% csrf_token %}
    {% for radio in answer_form.choice %}
        <label><input name="choice" type="radio" value="{{ radio.choice_value }}" onchange="question_{{ question.id }}.submit()">{{ radio.choice_label }}</label>
    {% endfor %}
    {{ answer_form.hidden_field }}
</form>
{% endfor %}

编辑:

尝试将问题ID传递为<input type="hidden" name="q_id" value="{{ question.id }}">

<h1>{{ apartment.title }}</h1>
{% for question in questions %}
<h3>{{ question.title }}</h3>
    <form id="question_{{ question.id }}" name="question_{{ question.id }}" action="/apartments/{{ apartment.id }}/" method="post">
        {% csrf_token %}
        <input type="hidden" name="q_id" value="{{ question.id }}">
        {% for radio in answer_form.choice %}
            <label><input name="choice" type="radio" value="{{ radio.choice_value }}" onchange="question_{{ question.id }}.submit()">{{ radio.choice_label }}</label>
        {% endfor %}
    </form>
{% endfor %}

并将我的表格改为

class AnswerForm(Form):
    choice = ChoiceField(label='', widget=RadioSelect, choices=ANSWERS)

但是,回复中没有隐藏的输入......

<tr><th></th><td><ul id="id_choice">
    <li><label for="id_choice_0"><input id="id_choice_0" name="choice" type="radio" value="0" required /> Точно ні</label></li>
    <li><label for="id_choice_1"><input id="id_choice_1" name="choice" type="radio" value="1" required /> Скоріше ні</label></li>
    <li><label for="id_choice_2"><input checked="checked" id="id_choice_2" name="choice" type="radio" value="2" required /> Не можу відповісти</label></li>
    <li><label for="id_choice_3"><input id="id_choice_3" name="choice" type="radio" value="3" required /> Скоріше так</label></li>
    <li><label for="id_choice_4"><input id="id_choice_4" name="choice" type="radio" value="4" required /> Точно так</label></li>
</ul></td></tr>

已清理的数据{'choice': '2'}

1 个答案:

答案 0 :(得分:0)

将问题ID作为隐藏值传递,如下所示:

<input type="hidden" name="q_id" value="{{ question.id }}">
{% for radio in answer_form.choice %}
    <label><input name="choice" type="radio" value="{{ radio.choice_value }}" onchange="question_{{ question.id }}.submit()">{{ radio.choice_label }}</label>
{% endfor %}