Python - Django - поле выбора формы и cleaned_data - PullRequest
0 голосов
/ 25 марта 2011

У меня проблема с тем, как работает cleaned_data.Я хочу сохранить cleaned_data в сеансе, чтобы позже можно было снова заполнить объект формы.Проблема заключается в том, что в моих полях выбора отображается отображаемое имя раскрывающегося списка, а не фактическое значение.Например:

<select name="dropdown_element">
<option value="1">Red</option>
<option value="2">Blue</option>
</select>

Если я выбрал Red и использовал form.cleaned_data ['dropdown_element'], я получу отображаемое имя Red, а не значение 1. Есть ли способ получить значение вместометка?

РЕДАКТИРОВАТЬ

ПРОСМОТР:

 def vehicle_add_fleet(request):
        if request.POST:
            fleet_form = FleetForm(request.POST, prefix='fleet')
            count_form = CountForm(request.POST, prefix='count', label='# of Odometer Readings')
            if fleet_form.is_valid() and count_form.is_valid():
                request.session['add'] = {}
                request.session['add']['fleet'] = fleet_form.cleaned_data
                return HttpResponseRedirect('/vehicle/add/general/%s/' % (count_form.cleaned_data['count']))
        else:
            fleet_form = FleetForm(prefix='fleet')
            count_form = CountForm(prefix='count', label='# of Odometer Readings')
        return render_to_response('add/fleet.html', {'fleet_form': fleet_form, 'count_form': count_form})

ФОРМА:

class FleetForm(forms.models.ModelForm):
    home_location = forms.ModelChoiceField(queryset=Location.objects.filter(home_only=True), required=False, label=_('Home Location'))
    number = forms.IntegerField(max_value=99999, label=_('Fleet Number'))
    ari_number = forms.IntegerField(max_value=999999, required=False, label=_('ARI Number'))
    class Meta:
        model = Fleet
        exclude = ('status')

МОДЕЛЬ:

class Fleet(models.Model):
     #One-to-Many
        status = models.ForeignKey(Status, verbose_name=_('Status'), default=3)
        pwgsc_spec_code = models.ForeignKey(PWGSCSpecCode, verbose_name=_('PWGSC Specification Code'))
        current_location = models.ForeignKey(Location, related_name='fleet_current', blank=True, null=True, verbose_name=_('Current Location'))
        home_location = models.ForeignKey(Location, related_name='fleet_home', blank=True, null=True, verbose_name=_('Home Location'))
        #Fields
        number = models.PositiveIntegerField(verbose_name=_('Fleet Number'))
        pool_identifier = models.CharField(max_length=1, verbose_name=_('Pool Identifier'))
        ari_number = models.PositiveIntegerField(blank=True, null=True, verbose_name=_('ARI Number'))
        credit_card_number = models.CharField(max_length=16, blank=True, verbose_name=_('Credit Card Number'))
        credit_card_expiry_date = models.DateField(blank=True, null=True, verbose_name=_('Credit Card Expiry Date'))
        company_name = models.CharField(max_length=16, blank=True, verbose_name=_('Company Name'))
        in_service_date = models.DateField(blank=True, null=True, verbose_name=_('In Service Date'))
        reason = models.TextField(blank=True, verbose_name=_('Reason'))

        class Meta:
            verbose_name = _('Fleet')
            verbose_name_plural = _('Fleets')

Итак, я хочу добавить данные формы флота (cleaned_data) в сеанс.Однако, когда я попадаю на страницу, где я хочу сохранить форму флота, я пытаюсь заполнить ее:

def vehicle_add(request):
    #save non-partial forms
    form = FleetForm(request.session['add']['fleet'])
    if form.is_valid():
        return HttpResponse('valid')
    else:
        return HttpResponse('invalid')

И я получаю сообщение об ошибке в строке form.is_valid ():

Ошибка типа в аргументе / vehicle / add / fleet / int () должна быть строкой или числом

Моя текущая теория заключается в том, что fleet_form.cleaned_data ["home_location"](например) сохраняет отображаемое значение, а не целое число в поле значения

Другая информация:

Я использовал django 1.1 и обновился до django 1.3.Во всех других примерах я вижу, что люди получают раскрывающееся значение, а не отображаемое значение.Надеюсь, этого достаточно!

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 26 марта 2011

Похоже, что префикс вашей формы вызывает странное поведение.Я не очень знаком с использованием префикса, поэтому не могу дать вам совет по этому поводу, но вы не используете префикс в вашем vehicle_add_view.

edit

Я провел некоторое тестирование

без префикса :

>>> from test.forms import TestForm
>>> form = TestForm(data={'test_field':'test_data'})
>>> form.__dict__
{'files': {}, 'is_bound': True, 'error_class': <class 'django.forms.util.ErrorList'>,
'empty_permitted': False, 'fields': {'test_field': <django.forms.fields.CharField 
object at 0x99d05ac>}, 'initial': {}, 'label_suffix': ':', 'prefix': None, 
'_changed_data': None, 'data': {'test_field': 'test_data'}, '_errors': None, 
'auto_id': 'id_%s'}
>>> form.is_valid()
True
>>> form.cleaned_data
{'test_field': u'test_data'}
>>>    

с префиксом:

>>> form = TestForm(data={'test_field':'test_data'}, prefix="foo")
>>> form.__dict__
{'files': {}, 'is_bound': True, 'error_class': <class 'django.forms.util.ErrorList'>,
'empty_permitted': False, 'fields': {'test_field': <django.forms.fields.CharField object 
at 0x99d03cc>}, 'initial': {}, 'label_suffix': ':', 'prefix': 'foo', '_changed_data': 
None, 'data': {'test_field': 'test_data'}, '_errors': None, 'auto_id': 'id_%s'}
>>> form.is_valid()
True
>>> form.cleaned_data
{'test_field': u''}
>>> 

обратите внимание, что в cleaned_data отсутствует значение, даже если оно выглядит как данные в форме.Надеюсь, это поможет вам в правильном направлении, если вы решите проблему.

0 голосов
/ 25 марта 2011

Предполагается, что ваша модель:

class SomeModel(models.Model):
    colour = models.IntegerField(choices=[(1, 'Red'), (2, 'Blue'),])

Ваша форма:

class SomeModelForm(forms.ModelForm):
    class Meta:
        model = SomeModel

Отображение вышеуказанной формы в шаблоне и после GET / POST должно дать вам целочисленное значение цвета.

...