【问题标题】:How do I initialize a ForeignKey ModelChoiceField in Django?如何在 Django 中初始化 ForeignKey ModelChoiceField?
【发布时间】:2011-08-11 16:24:01
【问题描述】:

这一定在 Django 文档中的某个地方,但我似乎找不到。

假设我有以下模型:

models.py

class MyModel(models.Model):
    name = models.CharField(max_length=15)

class MyOtherModel(models.Model):
    title = models.CharField(max_length=50)
    my_model = models.ForeignKey(MyModel)

我创建了一个表单来更改 Select 小部件的背景颜色:

forms.py

class MyOtherModelForm(ModelForm):
    my_model=ModelChoiceField(queryset=MyModel.objects.all())

    class Meta:
        model = MyOtherModel

    def __init__(self, *args, **kwargs):
        super(MyOtherModelForm, self).__init__(*args, **kwargs)
        self.fields['my_model'].widget = Select(attrs={'style':'background_color:#F5F8EC'})

在添加背景颜色代码之前一切正常。添加该行后,我会立即出现一个彩色但未填充的选择小部件。我认为这是因为一旦我指定了小部件行为的某些方面,Django 就会寻找要指定的所有内容。

那么我如何告诉它使用来自 MyModel 的值来填充 Select 小部件?

【问题讨论】:

    标签: django forms foreign-keys widget


    【解决方案1】:

    看看Overriding the default field types or widgets。基于此,我会尝试以下方法。

    from django.forms import ModelForm, Select
    
    class MyOtherModelForm(ModelForm):
        my_model=ModelChoiceField(queryset=MyModel.objects.all(), widget=Select(attrs={'style':'background_color:#F5F8EC'}))
    
        class Meta:
            model = MyOtherModel
    

    将 self.fields['my_model'].queryset = MyModel.objects.all() 添加到您的 init 也可能有效。

    【讨论】:

    • 感谢您的指导。如果我理解正确,这表明我需要在表单中显式创建一个 ModelChoiceField。我编辑了我的代码(和这个问题)来做到这一点,但 Select 小部件仍然是空的。
    • 我的想法是,您可以使用 widgets = {} 将所需的样式添加到您的选择中,而不是覆盖 init 方法。我认为这可能会解决您使用空选择小部件的问题。
    • 进一步查看了该文档并尝试在 Meta 下声明小部件颜色。当我这样做时,我会得到一个未着色的填充下拉列表。如果我将颜色规范保留在上述问题中的位置,我会得到一个彩色的、未填充的下拉列表。
    • 是的,这似乎确实是文档所说的,但进一步研究似乎该行为完全由 init 中的单行控制。如文档所示添加或删除其他行似乎没有任何效果。
    • 希望可行。您还可以在模型之外应用样式。这是我通常采取的路线。我认为字段 id 类似于 my_model_id ,因此将以下 CSS 添加到您的模板和外部 CSS 文件也应该可以工作。 #my_model_id{你的风格}。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多