在ModelForm上提供自定义选择

时间:2017-09-27 16:56:32

标签: django-forms

我正在尝试为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

2 个答案:

答案 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