我需要制作一个表单,它有1个选择和1个文本输入.必须从数据库中选择.模型看起来像这样:
class Province(models.Model):
name = models.CharField(max_length=30)
slug = models.SlugField(max_length=30)
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
它的行只由admin添加,但所有用户都可以在表单中看到它.我想从那里制作一个ModelForm.我做了这样的事情:
class ProvinceForm(ModelForm):
class Meta:
CHOICES = Province.objects.all()
model = Province
fields = ('name',)
widgets = {
'name': Select(choices=CHOICES),
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.select标签不会以html格式显示.我错了什么?
更新:
这个解决方案可以正常工作:
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',)
Run Code Online (Sandbox Code Playgroud)
Yuj*_*ita 13
阅读Maersu对"正常工作"方法的回答.
如果你想自定义,知道选择需要一个元组列表,即 (('val','display_val'), (...), ...)
选择文档:
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 )),
}
Run Code Online (Sandbox Code Playgroud)
模型:
class UserProvince(models.Model):
user = models.ForeignKey(User)
province = models.ForeignKey(Province)
Run Code Online (Sandbox Code Playgroud)
形成:
class ProvinceForm(ModelForm):
class Meta:
model = UserProvince
fields = ('province',)
Run Code Online (Sandbox Code Playgroud)
视图:
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()
Run Code Online (Sandbox Code Playgroud)