【问题标题】:How do you set the initial value for a ManyToMany field in django?如何在 django 中设置 ManyToMany 字段的初始值?
【发布时间】:2010-03-25 00:37:28
【问题描述】:

我正在使用 ModelForm 创建表单,并且我已经为表单中的每个字段设置了初始值,但 ManyToMany 字段除外。

我知道我需要给它一个列表,但我无法让它工作。我现在认为的代码是:

        userProfile = request.user.get_profile()
        employer = userProfile.employer
        bar_memberships = userProfile.barmembership.all()
        profileForm = ProfileForm(
            initial = {'employer': employer, 'barmembership' : bar_memberships})

但这不起作用。我在这里遗漏了什么吗?

根据 cmets 中的请求,这是我的模型的相关部分:

# a class where bar memberships are held and handled.
class BarMembership(models.Model):
    barMembershipUUID = models.AutoField("a unique ID for each bar membership",
        primary_key=True)
    barMembership = USStateField("the two letter state abbreviation of a bar membership")

    def __unicode__(self):
        return self.get_barMembership_display()

    class Meta:
        verbose_name = "bar membership"
        db_table = "BarMembership"
        ordering = ["barMembership"]

以及正在扩展的用户配置文件:

# a class to extend the User class with the fields we need.
class UserProfile(models.Model):
    userProfileUUID = models.AutoField("a unique ID for each user profile",
        primary_key=True)
    user = models.ForeignKey(User,
        verbose_name="the user this model extends",
        unique=True)
    employer = models.CharField("the user's employer",
        max_length=100,
        blank=True)
    barmembership = models.ManyToManyField(BarMembership,
        verbose_name="the bar memberships held by the user",
        blank=True,
        null=True)

希望这会有所帮助。

【问题讨论】:

    标签: django many-to-many


    【解决方案1】:

    好的,我终于想通了。上帝啊,有时解决方案太容易了。

    我需要做的:

    profileForm = ProfileForm(instance = userProfile)
    

    我进行了更改,现在一切正常。

    【讨论】:

      【解决方案2】:

      尽管 mlissner 的答案在某些情况下可能有效,但我认为这不是您想要的。关键字“instance”用于更新现有记录。

      参考您尝试使用关键字“initial”,只需将行更改为:

      bar_memberships = userProfile.barmembership.all().values_list('pk', flat=True)
      

      我没有用你的代码测试过这个,但我在我的代码中使用了类似的东西,它可以工作。

      【讨论】:

      • 我认为这需要 bar_memberships = list(userProfile.barmembership.all().values_list('pk', flat=True))。因此,只需围绕您现在拥有的内容添加列表功能。
      猜你喜欢
      • 1970-01-01
      • 2019-03-20
      • 2018-08-21
      • 2019-07-15
      • 2010-10-23
      • 2018-05-01
      • 2014-04-18
      • 2018-12-17
      • 2016-03-13
      相关资源
      最近更新 更多