Используя Django, выбранная опция выпадающего меню не передается на сервер - PullRequest
0 голосов
/ 27 августа 2018

Я использую Django и jQuery.

Мой forms.py:

CARPET_TYPE = (
    ('', 'Select a carpet type'),
    ('NRM', 'Normal'),
    ('SLK', 'Silk'),
    ('WOL', 'Wool'),
    ('PER', 'Persian')
)


class CalculationForm(forms.Form):
    carpet_types = forms.ChoiceField(initial='', choices=CARPET_TYPE, label='Carpet Types',)

    length = forms.FloatField(min_value=0)

    width = forms.FloatField(min_value=0)

Мой calculation_form.html (который используется как block content в моем index.html):

    <form action="{% url 'cleaners:pick_up' %}"  method="POST" id="main_form" class="probootstrap-form">
{% csrf_token %}
<div class="form-group">
<div class="row">
  <div class="col-md">
    <div class="probootstrap-size-wrap">
      <label for="{{ form.carpet_types.id_for_label }}">{{ form.carpet_types.label_tag }}</label>

      <!-- <label for="id_label_single" style="width: 100%;"> -->
        <select class="js-example-basic-single js-states form-control" id="id_label_single" name="dd-carpets"
                style="width: 100%;">
            {% for choice in form.carpet_types.field.choices %}
                <option value="{{choice.0}}" name="{{form.carpet_types.html_name}}">{{choice.1}}</option>
            {% endfor %}
        </select>
      <!-- </label> -->

     </div>
  </div>
</div>
  <!-- END carpet type row -->

<div class="row carpet-length">
  <div class="col-md meters-column">
    <div class="form-group" id="calc_main">
      <label for="{{ form.length.id_for_label }}">{{ form.length.label_tag }}</label>
      <div class="probootstrap-size-wrap">
        <input type="text" id="length" class="form-control" name="{{ form.length.html_name }}"
               placeholder="Enter the length of your carpet">
      </div>
    </div>
  </div>
</div>
<!-- END length row -->

<div class="row carpet-width">
  <div class="col-md meters-column">
    <div class="form-group" id="calc_main">
      <label for="{{ form.width.id_for_label }}">{{ form.width.label_tag }}</label>
      <div class="probootstrap-size-wrap">
        <input type="text" id="width" class="form-control" name="{{ form.width.html_name }}"
               placeholder="Enter the width of your carpet">
      </div>
    </div>
  </div>
</div>
<!-- END width row -->

<input type="hidden" id="service_cost" name="service_cost" value="">

<div class="row">
  <div class="col-sm-12 calculate">
    <input type="submit" id="calculate_btn" value="Calculate" class="btn btn-primary btn-block">
  </div>
</div>
</div>
</form> <!-- END form -->

и наконец мой views.py:

def pick_up(request):
    # If this is a GET request create the calculation form
    if request.method == 'GET':
        calculation_form_pickup = CalculationForm()
    else:
        calculation_form_pickup = CalculationForm(request.POST)

        if calculation_form_pickup.is_valid():
            carpet_type = calculation_form_pickup.cleaned_data['dd-carpets']
            length = calculation_form_pickup.cleaned_data['length']
            width = calculation_form_pickup.cleaned_data['width']

Теперь, когда я выбираю тип ковра и вставляю ширину и длину в форму, я получаю сообщение об ошибке, когда if calculation_form_pickup.is_valid() выполняется, что поле carpet_types является обязательным. При проверке данных POST я вижу, что поле carpet_types не "очищено". Как будто я ничего не выбрал в выпадающем меню.

Что я делаю не так?

EDIT: Я забыл упомянуть, что этот калькулятор основан на шаблоне начальной загрузки, использующем библиотеку select2.

1 Ответ

0 голосов
/ 27 августа 2018

Вы указали свой атрибут выбора имени "dd-carpets" вместо "carpet_types".

...