【问题标题】:Django ModelChoiceField is not initially selected according to related modelsDjango ModelChoiceField 最初没有根据相关模型选择
【发布时间】:2018-09-03 10:44:46
【问题描述】:

我在使用 Django 的 ModelChoiceField 时遇到了一些困难。

我写了以下代码:

class BookForm(ModelForm):
    publisher = forms.ModelChoiceField(queryset=Publisher.objects.all())
    ...

现在 Book 和 Publisher 是这样关联的:Book → Library → SubPublisher → Publisher。所有关系都是使用 ForeignKey 建立的。

我的表格是这样的:

  • 发布者(ModelChoiceField)
  • SubPublisher(带有自动完成小部件的 ModelChoiceField,可根据 Publisher 选择进行过滤)
  • 库(与 SubPublisher 相同,根据 SubPublisher 过滤)

我的问题是我无法让 ModelChoiceField 从发布者列表中选择相关发布者。

注意:Publisher 和 SubPublisher 仅用于过滤库 - 它有效,问题仅在于根据所选库的 ForeignKeys 设置初始值。

我错过了什么?

【问题讨论】:

  • 添加 -- publisher = forms.ModelChoiceField(queryset=Publisher.objects.all(), initial='1')
  • thx 但这会让我得到 pk=1 的项目,这不是我的意图。我想选择属于所选子发布者的发布者

标签: django python-3.x django-forms modelchoicefield


【解决方案1】:

我想通了。发布,以便对其他人有所帮助。

像这样覆盖 ModelForm init 函数:

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if kwargs['instance']:
            model_instance = kwargs['instance']

然后,使用从模型实例中获取的 id(s) 来覆盖 ModelForm 字段的初始数据,这里是问题中的示例:

            if hasattr(model_instance, 'library') \
                and hasattr(model_instance.library, 'subpublisher_id'):
            subpublisher_id = model_instance.library.subpublisher_id
            self.fields['subpublisher'].initial = subpublisher_id
            if hasattr(model_instance.library, 'subpublisher') \
                    and hasattr(model_instance.library.subpublisher, 'publisher_id'):
                publisher_id = str(model_instance.library.subpublisher_id.publisher_id)
                self.fields['publisher'].initial = publisher_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多