Выбор полей() в качестве набора запросов?
Мне нужно сделать форму, в которой есть 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),
}
но это не сработает. Тег select не отображается в html. Что я не так понял?
UPDATE:
Это решение работает так, как я хочу, чтобы он работал:
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',)
Ответы
Ответ 1
Прочтите ответ Maersu для метода, который просто "работает".
Если вы хотите настроить, знайте, что выбор принимает список кортежей, то есть (('val','display_val'), (...), ...)
Выбор doc:
Итерируемый (например, список или кортеж) 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 )),
}
Ответ 2
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()