Django-как работает ModelChoiceField queryset?

у меня есть форма с ModelChoiceField, и я хочу загрузить на нее таблицу из моей БД. Если я использую этот queryset в init моей формы, то форма моего представления.is_valid отлично работает:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('idCategoria',flat=True)

enter image description here

этот код показывает список идентификаторов на ModelChoiceField, но мне нужно показать список категорий. Поэтому я использую:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True)

но используя этот код .is_valid не проверяет, и я получаю ошибку формы: "выберите допустимый выбор. Этот выбор не является одним из доступный выбор.- Какой-нибудь намек на то, в чем может быть проблема?

Error recived

модель

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

документация ModelChoiceField

на __unicode__ метод модели будет вызван для генерации строковые представления объектов для использования в выборе поля;