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

Как создать форму Django с объектами модели в виджет Select?

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

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

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

1. Stackoverflow
2. Serverfault
3. Superuser

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

<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())

Любые идеи, как я могу достичь этого с помощью формы Django?

ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Изменить -

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

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

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