Почему я не могу получить радио кнопки при использовании формы RadioSelect в Django? - PullRequest
0 голосов
/ 17 мая 2019

Я работаю над созданием страницы, где пользователь может выбрать месяц с помощью переключателей. Мне также нужно собрать другую информацию, такую ​​как имя, фамилия, адрес электронной почты, номер телефона и компания. При этом я решил, что использование форм Django должно быть выполнено. Я начал и все реализовал и добрался до части радиокнопок. Я узнал, что мне нужно сделать это, используя ChoiceField, и что RadioSelect является виджетом этого. Все мои варианты отображаются, но я не могу щелкнуть ни один из них, чтобы выбрать их. Кроме того, это будет обязательный вопрос, и я не уверен, как сделать эту форму обязательной, поскольку ее можно оставить пустой, и я вижу, что она по-прежнему будет POST без проблем.

Я погуглил все под солнцем. Я попытался установить начальный выбор для этого, надеясь, что он покажет хотя бы одну радиокнопку, но этого не произошло. Я попытался просто сделать widget = forms.Select () вместо RadioSelect () и по-прежнему отображать месяцы, но я не могу выбрать ни одного из них. Не уверен, что делать. Это использует Django 2.1, если это помогает.

index.html --- Пожалуйста, обратите внимание, что, хотя у меня есть место для переключателей на месяц, я пытаюсь не использовать их в шаблоне и предпочитаю их в файле form.py {% extends '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

1 Ответ

1 голос
/ 17 мая 2019

Если вам действительно не нужно делать это самостоятельно, вы должны позволить 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 }}, а другой жестко задан в шаблоне.Попробуйте удалить жестко запрограммированные входные данные и посмотрите, начнет ли форма работать так, как ожидалось.

...