Как создать форму Django с объектами модели в виджете Select? - PullRequest
12 голосов
/ 31 марта 2010

Допустим, я использую модель сайта Django:

class Site(models.Model):
    name = models.CharField(max_length=50)

Значения моего сайта (ключ, значение):

1. Stackoverflow
2. Serverfault
3. Superuser

Я хочу создать форму с помощью HTML-виджета выбора с указанными выше значениями:

<select>
    <option value="1">Stackoverflow</option>
    <option value="2">Serverfault</option>
    <option value="3">Superuser</option>
</select>

Я думаю начать со следующего кода, но он неполон:

class SiteForm(forms.Form):
    site = forms.IntegerField(widget=forms.Select())

Есть идеи, как мне этого добиться с помощью формы Джанго?

EDIT

На разных страницах будут представлены разные значения сайта. Страница разработчика покажет сайты разработчиков, а страница кулинарии покажет сайты рецептов. Я в основном хочу динамически заполнять выбор виджетов на основе представления. Я полагаю, что в настоящий момент могу добиться этого, вручную создав HTML в шаблоне.

Ответы [ 2 ]

12 голосов
/ 01 апреля 2010

Я не проверял это, но я думаю о чем-то вроде ...

site = forms.IntegerField(
    widget=forms.Select(
        choices=Site.objects.all().values_list('id', 'name')
        )
     )

Редактировать -

Я только что попробовал это, и он правильно генерирует выбор. Аргумент choices ожидает список из двух кортежей, подобных этому ...

(
   (1, 'stackoverflow'),
   (2, 'superuser'),
   (value, name),
)

.values_list вернет точный формат при условии, что у вас есть идентификатор и имя / заголовок / что угодно, как: .values_list('id', 'name'). После сохранения формы значение .site будет идентификатором / pk выбранного сайта.

11 голосов
/ 01 апреля 2010

Я думаю, что вы ищете ModelChoiceField.

ОБНОВЛЕНИЕ: особенно обратите внимание на аргумент queryset. В представлении, поддерживающем страницу, вы можете изменить QuerySet, который вы предоставляете, основываясь на любых критериях, которые вас интересуют.

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