Я пишу простую форму в Django, которая включает в себя ChoiceField, позволяющий пользователям выбирать из списка категорий.Наверняка я хочу передать category_id для обработки.Это мой код:
models.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
forms.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})
Теперь все вроде бы хорошо, кроме случаев, когда я отправляю форму.Он жалуется на идентификаторы категории.Там написано: Выберите правильный выбор.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.Не могли бы вы объяснить?