我正在构建一个页面,用户可以在其中使用单选按钮选择一个月。我还需要收集与此相关的其他信息,例如名字,姓氏,电子邮件,电话号码和公司。为此,我认为使用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())
我期望这几个月来将显示用户可以选择的单选按钮
答案 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,以获取干净的模板并更正值,如果对此有疑问,请告诉我。