Как создать форму 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 в шаблоне.
Ответы
Ответ 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 выбранного сайта.