【问题标题】:Why can't I get radio buttons when using RadioSelect form in Django?为什么在 Django 中使用 RadioSelect 表单时无法获得单选按钮?
【发布时间】:2019-10-05 01:43:03
【问题描述】:

我正在构建一个页面,用户可以在其中通过使用单选按钮选择月份。我还需要收集其他信息,例如名字、姓氏、电子邮件、电话号码和公司。在这样做时,我认为使用 Django 表单应该可以完成工作。我开始并实现了一切,并进入了单选按钮的部分。我发现我需要使用 ChoiceField 来执行此操作,而 RadioSelect 是它的一个小部件。我的所有选择都显示出来了,但我无法单击其中任何一个来选择它们。此外,这将是一个必填问题,我不知道如何将其设为必填表单,因为它可以留空,我看到它仍然会毫无问题地发布。

我用谷歌搜索了阳光下的一切。我试图为它设置一个初始选择,希望它至少显示一个单选按钮,但没有这样做。我尝试只做 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())

我对此的期望是使用用户可以从中选择的单选按钮显示月份

【问题讨论】:

  • 请显示视图和模板。
  • Worksforme,问题可能出在其他地方。一些花哨的 JS?
  • @DanielRoseman,我添加了它们。感谢您的回复。
  • @frnhr,我很高兴它对你有用。那里没有花哨的JS。还没有添加。
  • @TheCodingRecruiter 除了 2 个月(您应该从模板中删除手动创建的)之外,您的代码运行良好 - 我可以看到打印的验证数据和 POST 数据。

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


【解决方案1】:

这里有很多问题,但为了澄清一点,有相同的问题,django 收音机选择在大多数情况下显示类似这样的内容

<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 以获得干净的模板和正确的值,如果你对此有疑问,请告诉我。

【讨论】:

    【解决方案2】:

    除非你真的必须自己做,否则你应该让 Django 为你渲染input 标签。

    您可以使用{{ form }}{{ form.as_p }} 或类似名称让它呈现整个表单。或者您可以呈现单个字段,例如:{{ form.month }}(以及 {{ form.month.errors }} 以显示任何验证错误)。相关文档:https://docs.djangoproject.com/en/2.2/topics/forms/#rendering-fields-manually

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

    【讨论】:

    • 感谢您的回复。在 RadioSelect 不起作用后,我只添加了第二组输入。它显示月份,但不能选择月份。我删除了第二个输入,但仍然遇到同样的问题。我想可能是我的浏览器。
    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 2014-12-30
    • 2020-03-10
    • 2017-08-21
    • 2015-03-09
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多