我正在尝试为modelForm创建自定义下拉选择。现在,模型表单只显示没有层次结构的所有单元。我希望该表格有一个选择框,如父母/孩子,由大学订购,然后由他们的部门订购:
<select>
<option value="10000">COLLEGE A</option>
<option value="10001"> DEPT A</option>
<option value="10002"> DEPT B</option>
<option value="20000">COLLEGE B</option>
<option value="20001"> DEPT C</option>
.....
</select>
我有一个所有&#34;单位的模型&#34;在我们的校园里。如果父母是无,那么它就是大学。每个部门都指向一所大学。
class Units(models.Model):
unit_name = models.CharField(max_length=255)
enabled = models.BooleanField(default=True)
parent = models.ForeignKey("self", null=True)
def __str__(self):
if self.parent:
return self.parent.unit_name + ': ' + self.unit_name
else:
return self.unit_name
我按如下方式抽象了我的User类,因此我的所有用户都可以拥有一个关联的单元
class Profile(AbstractUser):
associated_unit = models.ForeignKey(Units)
...........
在编辑用户的屏幕上,我想要下拉的associated_unit框来列出上面的层次结构,而不是那么线性。这就是我到目前为止只能列出表格#34;已启用&#34;单元。
forms.py
class UserForm(ModelForm):
class Meta:
model = Profile
fields = ('id', 'first_name', 'last_name', 'username', 'is_active', 'associated_unit')
def __init__(self, **kwargs):
super(UserForm, self).__init__(**kwargs)
self.fields['associated_unit'].queryset = Units.objects.filter(enabled=True).order_by('parent__unit_name', 'unit_name')
如上所述,如何创建自定义选择下拉菜单?任何帮助表示赞赏。厌倦了实验和研究:D
答案 0 :(得分:0)
我发现这个有效。可能不是最好的解决方案,但确实有效。无论是大学/部门名称,都无法在选择框中显示空格。
使用&gt;代替。
from users.models import Profile
from units.models import Units
from django.forms import ModelForm, ChoiceField
class UserForm(ModelForm):
class Meta:
model = Profile
fields = ('id', 'first_name', 'last_name', 'username', 'is_active', 'associated_unit')
def __init__(self, **kwargs):
super(UserForm, self).__init__(**kwargs)
my_list = []
colleges = Units.objects.filter(parent=None, enabled=True).order_by('unit_name')
for college in colleges:
my_list.append((college.id, college.unit_name))
departments = Units.objects.filter(parent=college.id, enabled=True).order_by('unit_name')
for department in departments:
my_list.append((department.id, " => " + department.unit_name))
self.fields['associated_unit'] = ChoiceField(choices=my_list)
答案 1 :(得分:0)
我将最后一行更改为: self.fields ['associated_unit']。choices = my_list 。似乎现在保存:D
class UserForm(ModelForm):
class Meta:
model = Profile
fields = ('first_name', 'last_name', 'username', 'is_active', 'associated_unit')
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
my_list = []
colleges = Units.objects.filter(parent=None, enabled=True).order_by('unit_name')
for college in colleges:
my_list.append((college.id, college.unit_name))
departments = Units.objects.filter(parent=college.id, enabled=True).order_by('unit_name')
for department in departments:
my_list.append((department.id, " => " + department.unit_name))
self.fields['associated_unit'].choices = my_list