【问题标题】:Set default value or instance for django ModelForm ManyToMany field为 django ModelForm ManyToMany 字段设置默认值或实例
【发布时间】:2015-03-27 13:10:41
【问题描述】:

我的 django 应用程序中有两个模型,其中一个模型到另一个模型中有 ManyToMany 字段。我想为 ManyToMany 字段设置默认值,但无法做到这一点。
我的模型是

Class Model1(models.Model):
    name = models.CharField(max_length=100)

class Model2(models.Model):
    model1 = models.ManyToManyField(Model1, null=True, blank=True, default=Model1.objects.first())

但是使用这个我得到这个错误

    raise AppRegistryNotReady("Models aren't loaded yet.")
    django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

我通过定义一个显式变量来尝试它,也像

m1 = Model1.objects.first()
and assigning this m1 variable to the field as default but same error again.

请建议我如何为 django 中的 M2Mfield 分配默认值。我希望当模型表单在模板上呈现时应该选择选项的第一个对象。

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    鉴于 Django 解析模型类的方式,您不能那样做,因为“模型尚未加载” 默认设置在“解析时间”

    但您可以使用可调用对象作为默认值。

    def get_first_model1():
        return Model1.objects.first()
    
    class Model2(models.Model):
        model1 = models.ManyToManyField(Model1, null=True, blank=True, default=get_first_model1)
    

    你应该使用的是可调用而不是结果值,因此没有括号。

    通过此修改,如果您不提供model1属性值,则在创建新Model2时将在执行时调用默认callable。

    【讨论】:

    • 给定的解决方案在一定程度上有效。它没有给我models are not loaded yet 错误,但在模板中它给出了错误'int' object is not iterable 并且在终端上出现错误` selected_choices = set(force_text(v) for v in selected_choices) TypeError: 'int' object is not iterable `
    • 代码可用于为新创建的对象设置默认值。关于表格,也许这篇文章会有所帮助:stackoverflow.com/questions/604266/…
    • 我认为 M2M 字段的默认值应该是pk 的列表,所以不要使用return Model1.objects.first() 试试return [Model1.objects.first().pk]
    • 我知道这是旧的,但我在寻找类似的东西时偶然发现了这个和that (old and "unresolved") ticket。希望这会为某人节省一些时间:对于 ManyToManyField 的“默认”,django 的行为似乎不像预期的那样......我不得不按照this comment 中的建议使用post_save 信号。
    猜你喜欢
    • 2017-11-13
    • 2018-07-17
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多