Форма Джанго не принимает выбор в качестве действительного выбора.Не могу понять почему - PullRequest
2 голосов
/ 19 февраля 2011

Я сделал небольшую форму, в которой я спрашиваю пользователя о каком-либо местоположении (1-й этап), затем геокодирую местоположение и прошу пользователя подтвердить местоположение (2-й этап).Все работает нормально, однако, , когда я выбираю выбор и пытаюсь отправить форму, чтобы перейти к 3-му этапу, форма не принимает выбор и выдает ошибку «Выберите правильный выбор».Почему?

Я не вижу, где я допустил ошибку.Пожалуйста, дайте мне знать, что я сделал не так.Спасибо!

мой forms.py

from django.http import HttpResponseRedirect
from django.contrib.formtools.wizard import FormWizard
from django import forms
from django.forms.widgets import RadioSelect
from geoCode import getLocation

class reMapStart(forms.Form):
    location = forms.CharField()
    CHOICES = [(x, x) for x in ("cars", "bikes")]
    technology = forms.ChoiceField(choices=CHOICES)


class reMapLocationConfirmation(forms.Form):    
   CHOICES = []
   locations = forms.ChoiceField(widget=RadioSelect(), choices = [])

class reMapData(forms.Form):
    capacity = forms.IntegerField()

class reMapWizard(FormWizard):    
    def render_template(self, request, form, previous_fields, step, context=None):
        if step == 1:
            location = request.POST.get('0-location')
            address, lat, lng, country = getLocation(location)
            form.fields['locations'].choices = [(x, x) for x in address]
        return super(reMapWizard, self).render_template(request, form, previous_fields, step, context)

def done(self, request, form_list):
    # Send an email or save to the database, or whatever you want with
    # form parameters in form_list
    return HttpResponseRedirect('/contact/thanks/')

мой urls.py

...
(r'^reMap/$', reMapWizard([reMapStart, reMapLocationConfirmation, reMapData])),
...

сгенерированный HTML-код Django для случайного местоположения после 1-го представления

<form action='.' method='POST'><div style='display:none'>
<input type='hidden' name='csrfmiddlewaretoken' value='0f61c17790aa7ecc782dbfe7438031a8' /></div>
<table>
    <input type="hidden" name="wizard_step" value="1" />
    <input type="hidden" name="0-location" value="market street san francisco" id="id_0-location" /><input type="hidden" name="0-technology" value="car" id="id_0-technology" /><input type="hidden" name="hash_0" value="8a654e29d73f2c2f6660b5beb182f0c8" />
    <tr><th><label for="id_1-locations_0">Locations:</label></th><td><ul class="errorlist"><li>Select a valid choice. Market St, San Francisco, CA, USA is not one of the available choices.</li></ul><ul>

<li><label for="id_1-locations_0"><input checked="checked" type="radio" id="id_1-locations_0" value="Market St, San Francisco, CA, USA" name="1-locations" /> Market St, San Francisco, CA, USA</label></li>
</ul></td></tr>
</table>
<p><input type="submit" value="Submit" /></p>
</form>

Ответы [ 2 ]

4 голосов
/ 19 февраля 2011

Попробуйте установить варианты по умолчанию для всех ваших местоположений или , не делайте его ChoiceField, а CharField и устанавливайте его как ChoiceField только там, где вы переопределяете форму.

locations = forms.ChoiceField(widget=RadioSelect(), choices = [..all..])

Я предполагаю, что выбор не сохраняется в течение нескольких POST с, и мастер проверяет все формы в конце.

Даже если ваша форма действительна для этого шага, в конце она становится недействительной.

Итак, добавьте все местоположения в исходный конструктор полей или сделайте его CharField для удаления автоматической проверки выбора.

1 голос
/ 19 февраля 2011

Решение после помощи Юджи:

инициализация класса с CharField

class reMapLocationConfirmation(forms.Form):
   locations = forms.CharField()

, а затем перезаписать в поле выбора

class reMapWizard(FormWizard):

    def render_template(self, request, form, previous_fields, step, context=None):
        if step == 1:
            location = request.POST.get('0-location')
            address, lat, lng, country = getLocation(location)
            form.fields['locations'] = forms.ChoiceField(widget=RadioSelect(), choices = [])
            form.fields['locations'].choices = [(x, x) for x in address]
        return super(reMapWizard, self).render_template(request, form, previous_fields, step, context)
...