Django ChoiceField или TypedChoiceField и неверный выбор идентификатора - PullRequest
0 голосов
/ 23 октября 2011

Я пишу простую форму в 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.Не могли бы вы объяснить?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

По какой-то причине вы разделили представление, отображающее форму, включая добавление вариантов выбора, и представление, обрабатывающее отправку.Вы не добавляете варианты при отправке, поэтому, конечно, значения не будут действительными.

Вам следует полностью избавиться от представления add_product_form.Вы можете переместить бит form.fields['category'].choices... в представление add_product, но лучшим решением будет использование поля формы, специально разработанного для получения выбора из модели или набора запросов - т.е. ModelChoiceField.

Просто используйте:

category = forms.ModelChoiceField(model=Category)

в определении вашей формы.

0 голосов
/ 23 октября 2011

Спасибо, Даниэль.Я начал изучать Django не так давно, и у меня есть склонность добавлять представления для отображения формы, что не является необходимым.Так что да, я избавился от add_product_form и полагался исключительно на add_product .Что касается поля выбора категории, то теперь оно закодировано следующим образом:Я надеюсь, что это помогает новичкам в Джанго.Пожалуйста, не стесняйтесь упоминать любые способы улучшения этого кода выше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...