在Django中使用RadioSelect表单时,为什么无法获得单选按钮?

时间:2019-05-17 17:46:15

标签: django python-3.x django-forms

我正在构建一个页面,用户可以在其中使用单选按钮选择一个月。我还需要收集与此相关的其他信息,例如名字,姓氏,电子邮件,电话号码和公司。为此,我认为使用Django表单应该可以完成这项工作。我开始并实现了所有内容,然后进入了单选按钮部分。我发现我需要使用ChoiceField进行此操作,而RadioSelect是它的一个小部件。我的所有选择都显示出来,但是我无法单击其中的任何一个来选择它们。另外,这将是一个必填问题,我不确定如何将其设置为必填表格,因为可以将其保留为空白,并且我仍然认为它可以进行POST而没有任何问题。

我在阳光下搜索了所有内容。我尝试为其设置一个初始选择,希望它会显示至少一个单选按钮,但没有这样做。我尝试仅执行widget = forms.Select()而不是RadioSelect()并仍然显示月份,但我无法选择其中任何一个。不知道该怎么办。如果有帮助,它将利用Django 2.1。

index.html ---请注意,尽管这里确实有一个单选按钮的位置,但我试图将它们不包含在模板中,而是希望它们放在form.py中。文件     {%扩展了“ landingpage / layout.html”%}

{% block content %}
<div class="h1 col s3 left-align grey lighten-4" style="font-family: 'Exo', sans-serif;">Welcome to FaithGuard</div>
<div class="div">
        <br>
        <br>
        <br>
        <br>
</div>

<div class="row" style="font-family: 'Exo', sans-serif;">


        <form method='POST' class="col s6"> {% csrf_token %}
{{ form }}

<div class="h1 col s6 grey lighten-4 radioRequired">Date of renewal/expiration</div>
<br>
<br>

<div class="div" id ="Exiration Month Div">
                <p>
                  <label>
                    <input name="month" value ="January" type="radio" />
                    <span>January</span>
                  </label>
         <label>
           <input name="month" value ="February" type="radio" />
          <span>February</span>
        </label>

         <label>
         <input name="month" value="March" type="radio"  />
         <span>March</span>
         </label>
         <label>
          <input name="month" value="April" type="radio" />
           <span>April</span>
        </label>
                </p>


                <p>
                  <label>
                    <input name="month" value="May" type="radio" />
                    <span>May</span>
                  </label>
                                    <label>
                    <input name="month" value="June" type="radio" />
                    <span>June</span>
                  </label>
                                    <label>
                    <input name="month" value="July" type="radio" checked/>
                    <span>July</span>
                  </label>
                                    <label>
                    <input name="month" value="August" type="radio" />
                    <span>August</span>
                  </label>
                </p>
                <p>
                  <label>
                    <input name="month" value="September" type="radio"  />
                    <span>September</span>
                  </label>
                                    <label>
                    <input name="month" value="October" type="radio" />
                    <span>October</span>
                  </label>
                                    <label>
                    <input name="month" value="November" type="radio" />
                    <span>November</span>
                  </label>
                                    <label>
                    <input name="month" Value="December" type="radio" />
                    <span>December</span>
                  </label>
                </p>
<div class="div right-align">
<button class="btn waves-effect waves-light" type="submit" name="action">Submit</button>
</div>

</div>
              </form>

      </div>

{% endblock %}

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .forms import ContactForm

# Create your views here.

def index(request):

    contact_form = ContactForm(request.POST or None)

    context = {
        'form' : contact_form

    }
    if contact_form.is_valid():
        print(contact_form.cleaned_data)

    if request.method == "POST":
        print(request.POST)
    #     print(request.POST.get('email'))



    return render(request, 'landingpage/index.html', context)

forms.py

from django import forms

class ContactForm(forms.Form):

firstname = forms.CharField(
    label="First Name", widget=forms.TextInput(
        attrs={
            "class": "form-control", 
            "placeholder": "First Name"
            }
            )
            )
lastname = forms.CharField(
    label="Last Name", widget=forms.TextInput(
        attrs={
            "class": "form-control", 
            "placeholder": "Last Name"
            }
            )
            )
npo = forms.CharField(
    label="Nonprofit Organization", widget=forms.TextInput(
        attrs={
            "class": "form-control", 
            "placeholder": "Nonprofit Organization",
            }
            )
            )
email = forms.EmailField()
phone = forms.IntegerField(min_value=999999)
month = forms.ChoiceField(label='Month of Renwal/Expiration', choices=[('1', 'January'), ('2', 'February'),('3', 'March'),('4','April'),('5','May'),('6','June'),('7','July'),('8','August'),('9','September'),('10','October'),('11','November'), ('12', 'December')], initial='1',
widget=forms.RadioSelect())


# EXAMPLE FROM ANOTHER STACKOVERFLOW RADIOSELECT ISSUE
# do_a = forms.ChoiceField(label='Do A',choices=[('1', 'Yes'), ('2', 'No'), ('3', 'Maybe')], initial='Maybe', widget = forms.RadioSelect())

我期望这几个月来将显示用户可以选择的单选按钮

This is what I see after removing the hardcoded inputs from the template

2 个答案:

答案 0 :(得分:1)

除非您真的必须自己做,否则应让Django为您呈现input标签。

您可以使用{{ form }}{{ form.as_p }}或类似的格式来渲染整个表单。或者,您可以渲染单个字段,例如:{{ form.month }}(也可以渲染{{ form.month.errors }}以显示任何验证错误)。相关文档:https://docs.djangoproject.com/en/2.2/topics/forms/#rendering-fields-manually

我认为您的直接问题是您在单个<form>元素中有重复的输入,即具有相同name属性的输入。一组输入(单选按钮)来自{{ form }}模板标记,而另一组则硬编码在模板中。尝试删除硬编码的输入,然后查看表单是否开始按预期运行。

答案 1 :(得分:0)

这里有很多问题,但有一点需要澄清,即具有相同的问题,在大多数情况下,django radio select会显示类似的内容

<label>
    {{ radio.choice_label }}
    <span>{{ radio.tag }}</span>
</label>

会产生这种情况,这就是收音机无法正常显示的原因

<label>
    <span>name_of_choice
       <input />
    </span>
</label>

我们需要做类似的事情

{% for radio in form.clientes %}
    <label>
        {{ radio.tag }}
        <span>{{ radio.choice_label }}</span>
    </label>
{% endfor %}

我建议您将views.py中的参数传递给forms.py,以获取干净的模板并更正值,如果对此有疑问,请告诉我。