Выбор полей () как набор запросов? - PullRequest
11 голосов
/ 24 февраля 2011

Мне нужно сделать форму, в которой есть 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),
        }

, но это не работает.Тег выбора не отображается в html.Что я не так?

ОБНОВЛЕНИЕ:

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

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',)

Ответы [ 2 ]

12 голосов
/ 24 февраля 2011

Прочтите ответ Маерсу о методе, который просто «работает».

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

Выбор документа:

Итерируемый (например, списокили кортеж) из 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 )),
        }
6 голосов
/ 24 февраля 2011

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() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...