Подтвердить что ты не робот

Выбор полей() в качестве набора запросов?

Мне нужно сделать форму, в которой есть 1 выбор и 1 ввод текста. Выбор нужно брать из базы данных. модель выглядит следующим образом:

class Province(models.Model):
    name = models.CharField(max_length=30)
    slug = models.SlugField(max_length=30)

    def __unicode__(self):
        return self.name

Строки для этого добавляются только администратором, но все пользователи могут видеть это в формах. Я хочу сделать ModelForm. Я сделал что-то вроде этого:

class ProvinceForm(ModelForm):
    class Meta:
        CHOICES = Province.objects.all()

        model = Province
        fields = ('name',)
        widgets = {
            'name': Select(choices=CHOICES),
        }

но это не сработает. Тег select не отображается в html. Что я не так понял?

UPDATE:

Это решение работает так, как я хочу, чтобы он работал:

class ProvinceForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProvinceForm, self).__init__(*args, **kwargs)
        user_provinces = UserProvince.objects.select_related().filter(user__exact=self.instance.id).values_list('province')
        self.fields['name'].queryset = Province.objects.exclude(id__in=user_provinces).only('id', 'name')

    name = forms.ModelChoiceField(queryset=None, empty_label=None)

    class Meta:
        model = Province
        fields = ('name',)
4b9b3361

Ответ 1

Прочтите ответ Maersu для метода, который просто "работает".

Если вы хотите настроить, знайте, что выбор принимает список кортежей, то есть (('val','display_val'), (...), ...)

Выбор doc:

Итерируемый (например, список или кортеж) 2-х кортежей для использования в качестве поле.

from django.forms.widgets import Select


class ProvinceForm(ModelForm):
    class Meta:
        CHOICES = Province.objects.all()

        model = Province
        fields = ('name',)
        widgets = {
            'name': Select(choices=( (x.id, x.name) for x in CHOICES )),
        }

Ответ 2

ModelForm охватывает все ваши потребности (также проверьте Список конверсий)

Модель:

class UserProvince(models.Model):
    user = models.ForeignKey(User)
    province = models.ForeignKey(Province)

форма:

class ProvinceForm(ModelForm):
    class Meta:
        model = UserProvince
        fields = ('province',)

Вид:

   if request.POST:
        form = ProvinceForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=True)
            obj.user = request.user
            obj.save()
   else:
        form = ProvinceForm()