【问题标题】:Python - Django - Form choicefield and cleaned_dataPython - Django - 表单选择域和cleaned_data
【发布时间】:2011-07-23 02:41:56
【问题描述】:

我对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。在所有其他示例中,我看到人们似乎获得了下拉值而不是下拉显示值。希望这是足够的信息!

感谢您的帮助

【问题讨论】:

  • 能否请您添加用于从表单和表单对象(您的 django 的 forms.Form 类)获取数据的代码。
  • 抱歉没有意识到他们是一个编辑按钮。

标签: django django-forms django-models choicefield cleaned-data


【解决方案1】:

假设您的模型是:

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

您的表格:

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

在模板中和 GET/POST 之后显示上述表单应该会给你颜色的整数值。

【讨论】:

    【解决方案2】:

    看起来给表单添加前缀会导致一些奇怪的行为。我对使用前缀不是很熟悉,所以我不能给你任何建议,但你没有在你的vehicle_add_view 中添加前缀。

    编辑

    我做了一些测试

    无前缀

    >>> 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 缺少值,即使看起来数据在表单中。希望这能让您在解决问题方面朝着正确的方向前进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      相关资源
      最近更新 更多