模型和表单中的Django多选和多选字段

时间:2018-08-26 02:24:07

标签: django

我正在学习Django,却遇到了一个问题,我不知道该怎么做给Google。我有标准的User模型和一个Profile模型,它们通过一个User字段指向OneToOne模型。该部分加上配置文件的表格和CBV都可以使用。

配置文件持有人可以具有一个或多个专业从属关系。这不是为了工会,而是我父亲(例如,作为一名焊工)隶属于:“钢铁工人”,“蒸汽钳工”,“锅炉制造者”,“管道钳工”以及其他几个使用焊工的特定工会。因此,如果我希望个人资料和表单允许有多个选择和多个选定结果作为从属关系,那么我看到您可能会使用

class Profile(models.Model):
    GROUPS = (
        ('IW', 'Iron Workers'),
        ('PF', 'Pipe Fitters'),
        ...
    )
    affiliation = models.CharField(
        max_length=3,
        choices=RANK,
        default='U',
        blank=True,
        null=True,
    )
    ...

在关联的表单中,看起来就像您使用的

    GROUPS = (
        ('IW', 'Iron Workers'),
        ('PF', 'Pipe Fitters'),
        ...
    )
    affiliation = forms.MultipleChoiceField(
        choices=GROUPS
    )

如果我想要这些选择项的数据库表而不是元组怎么办?如果必须添加到选项列表中,那么编辑代码可能不是最方便的选择。也许组列表应该在Django管理区域中。

如何告诉模型和表单在单独的db表中查找可能的值,然后如何修改模型和表单以允许零个或多个组隶属关系?

2 个答案:

答案 0 :(得分:1)

您需要为新模型创建many-to-many relationship,我们将其称为Skill,它代表可以动态创建的可用技能。

class Profile(models.Model):
    # ...

    skills = models.ManyToManyField(
        to='myapp.Skill',  # use a string in the format `app_name.model_name` to reference models to avoid issues using the model before it was defined
        related_name='user_profiles',  # the name for that relation from the point of view of a skill
    )

class Skill(models.Model):
    name = models.CharField(max_length=255)
    abbreviation = models.CharField(max_length=3)

然后在表单中,您只需添加多对多字段skills。默认情况下,它将是django管理员中的多项选择字段。

对于每对nprofile,该关系可以有零个到skill条目。换句话说,每个用户可以拥有0到n的技能,反之亦然。

要允许使用默认值,您将必须编写一个自定义迁移,以创建Skill的默认实体,以确保它在运行时位于数据库中。

答案 1 :(得分:0)

就我而言,我使用select2列表选项解决了这种方法。

它在视图中返回所选选项的列表。

表格

class PrecoattivoForm(forms.Form):
    entrate = AccertamentiEnte.objects.all().values("entrata_provvedimento").distinct()
    lista = []
        for i in entrate:

    lista.append([i.get('entrata_provvedimento'),i.get('entrata_provvedimento')])

    entrata_accertamento= forms.MultipleChoiceField(choices=lista, required=False)

模板

<div class="col-xl-10">

<selectclass="js-example-placeholder-multiple col-sm-12"

    multiple="multiple"
    name="{{ form.entrata_accertamento.name }}"
    id="{{ form.entrata_accertamento.id_for_label }}">
    {% for entrata in form.entrata_accertamento %}
    <option {% if form.name.value != None %}value=" 
    {{form.entrata_accertamento.value|upper }}"{% endif %}>{{ entrata }}</option>
    {% endfor %}
    </select>
</div>