Django-как работает ModelChoiceField queryset?
у меня есть форма с ModelChoiceField, и я хочу загрузить на нее таблицу из моей БД. Если я использую этот queryset в init моей формы, то форма моего представления.is_valid отлично работает:
self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('idCategoria',flat=True)
этот код показывает список идентификаторов на ModelChoiceField, но мне нужно показать список категорий. Поэтому я использую:
self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True)
но используя этот код .is_valid не проверяет, и я получаю ошибку формы: "выберите допустимый выбор. Этот выбор не является одним из доступный выбор.- Какой-нибудь намек на то, в чем может быть проблема?
модель
class sitio_categoria(models.Model):
idCategoria = models.AutoField(primary_key=True)
categoria = models.CharField(max_length=30, null=False, unique=True)
форма
class anadirComercioPaso1_form(forms.Form):
categoria_formfield = forms.ModelChoiceField(widget=forms.Select(attrs={'size':'13', 'onchange':'this.form.action=this.form.submit()'}), queryset=sitio_categoria.objects.none())
def __init__(self, *args, **kwargs):
super(anadirComercioPaso1_form, self).__init__(*args,**kwargs)
self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True)
1 ответов
Не используйте values_list
(или values
),ModelChoiceField
нужны реальные модели объектов.
queryset = sitio_categoria.objects.exclude(categoria='patrimonio')
ModelChoiceField
будет использовать первичные ключи объектов для проверки и их представление unicode для отображения. Поэтому вам нужно будет определить преобразование в unicode в вашей модели:
class sitio_categoria(models.Model):
idCategoria = models.AutoField(primary_key=True)
categoria = models.CharField(max_length=30, null=False, unique=True)
def __unicode__(self):
return self.categoria
на
__unicode__
метод модели будет вызван для генерации строковые представления объектов для использования в выборе поля;