我正在 Django 中编写一个简单的表单,其中包括一个 ChoiceField 允许用户从类别列表中进行选择。当然,我想传递要处理的 category_id。这是我的代码:
模型.py:
class Category(models.Model):
category = models.CharField(max_length=128)
def __unicode__(self):
return self.category
class Product(models.Model):
code = models.CharField(max_length=75)
name = models.CharField(max_length=128)
price = models.DecimalField(max_digits=7, decimal_places=2)
category = models.ForeignKey(Category)
def __unicode__(self):
return self.name
表格.py
class AddProductForm(forms.Form):
category = forms.ChoiceField(label=_('Category'))
product = forms.CharField(label=_('Product'), widget=forms.TextInput())
code = forms.CharField(label=_('Code'), widget=forms.TextInput())
price = forms.DecimalField(label=_('Price'))
现在在 views.py 中填写选项:
def add_product_form(request):
form = AddProductForm()
form.fields['category'].choices =[(c.id, c.category) for c in Category.objects.all()]
return render_to_response('product-form.html', {'form':form})
现在一切似乎都很好,除非我提交表格。它抱怨类别的 ID。它说: 选择一个有效的选择。1 不是可用的选项之一
这就是我处理表单的方式:
def add_product(request):
if request.method == 'POST':
form = AddProductForm(request.POST)
if form.is_valid():
category = request.cleaned_data['category']
product = form.cleaned_data['product']
code = form.cleaned_data['code']
price = form.cleaned_data['price']
product = Product(code=code, name=product, price=price, category_id=category)
product.save()
return HttpResponseRedirect('/ms-admin/')
else:
form = AddProductForm() # more is required here to fill the choices again
return render_to_response('product-form.html', {'form':form})
我对 TypedChoiceField 进行了同样的尝试,但得到了相同的无效数据。我知道这与 string 和 int 以及 unicode 之间的转换有关。你能解释一下吗?