Скажем, я использую модель Django Site:
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())
Какие-либо идеи, как я могу достигнуть этого с формой Django?
Править
Различные страницы представят различные стоимости площадки. dev страница покажет участки разработки, в то время как страница кулинарии покажет сайты рецепта. Я в основном хочу динамично заполнить выбор виджета на основе представления. Я полагаю, что могу достигнуть этого в данный момент путем ручной генерации HTML в шаблоне.
Думаю, вы ищете ModelChoiceField
.
ОБНОВЛЕНИЕ: особенно обратите внимание на аргумент queryset
. В представлении, поддерживающем страницу, вы можете изменить QuerySet
, который вы предоставляете, на основе любых критериев, которые вас интересуют.
Я не тестировал это, но я думаю что-то вроде...
site = forms.IntegerField(
widget=forms.Select(
choices=Site.objects.all().values_list('id', 'name')
)
)
Edit --
Я только что опробовал это, и он действительно генерирует варианты правильно. Аргумент choices
ожидает список из двух кортежей, вот так...
(
(1, 'stackoverflow'),
(2, 'superuser'),
(value, name),
)
.values_list
вернет именно такой формат, если у вас есть ID и имя/заглавие/что угодно, как показано ниже: .values_list('id', 'name')
. Когда форма будет сохранена, значением .site
будет id/пк выбранного сайта.