我遇到了clean_data似乎有效的问题。我想将sorted_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})
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')
MODEL:
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')
所以基本上我想将舰队表格数据(cleaning_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()中的TypeError 参数必须是字符串或数字
我目前的理论是fleet_form.cleaned_data [“home_location”](例如)存储显示值而不是值字段中的整数
其他信息:
我正在使用django 1.1并升级到django 1.3。在所有其他示例中,我看到人们似乎得到下拉值而不是下拉显示值。希望这是足够的信息!
感谢您的帮助
答案 0 :(得分:0)
假设您的模型是:
class SomeModel(models.Model):
colour = models.IntegerField(choices=[(1, 'Red'), (2, 'Blue'),])
您的表格:
class SomeModelForm(forms.ModelForm):
class Meta:
model = SomeModel
在模板中显示上述表单,并在GET / POST之后显示该颜色的整数值。
答案 1 :(得分:0)
看起来像表单前缀会导致一些奇怪的行为。我不熟悉使用前缀所以我不能给你任何建议,但你没有在你的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''}
>>>
请注意,即使数据在表单中,clean_data也会丢失该值。希望能够帮助您解决问题。