【问题标题】:How do I populate a ModelChoiceField from two Models如何从两个模型填充 ModelChoiceField
【发布时间】:2014-11-09 21:28:38
【问题描述】:

在我的表单中,我想用来自两个模型的数据填充一个 ModelChoiceField。

如何更改包含两个不同模型对象的查询集?

我的方法是将查询集打包在一个列表中。但这似乎不是数据的正确容器。

【问题讨论】:

    标签: django python-3.x forms model


    【解决方案1】:

    我认为您不能将 ModelChoiceField 与两个不同的模型一起使用,因为您不能拥有由两个不同模型组成的查询集。

    您最好尝试使用ChoiceField,它接受带有元组列表的选择参数。

    假设您在 models.py 中有两个模型,如下所示:

    from django.db import models
    
    class Model1(models.Model):
        name = models.CharField(max_length=20, primary_key=True)
        description = models.CharField(max_length=200)
    
    class Model2(models.Model):
        name = models.CharField(max_length=20, primary_key=True)
        description = models.CharField(max_length=200)
    

    您可以在 forms.py 中创建这样的表单:

    from django import forms
    
    from .models import Model1, Model2
    
    class MultipleModelChoiceForm(forms.Form):
        select = forms.ChoiceField(choices=[])
    
        def __init__(self, *args, **kwargs):
            super(MultipleModelChoiceForm, self).__init__(*args, **kwargs)
            choices = []
            for obj1 in Model1.objects.all():
                choices.append((obj1.name, obj1.description))
            for obj2 in Model2.objects.all():
                choices.append((obj2.name, obj2.description))
            self.fields['select'].choices = choices
    

    请注意,选项是在表单的 __init__ 中定义的,以便使用 Model1Model2 中的所有记录更新选择字段您创建表单的一个实例。

    【讨论】:

    • 这行得通 - 有点。如果我将另一个项目添加到模型中,则不会在我重新启动服务器时更新选项,而是将新选项填充到该字段中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2020-05-10
    相关资源
    最近更新 更多