代码之家  ›  专栏  ›  技术社区  ›  mlissner

如何设置django中manytomany字段的初始值?

  •  1
  • mlissner  · 技术社区  · 14 年前

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

    我知道我需要给它一个清单,但我不能让它工作。我现在看到的代码是:

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

    但那不管用。我是不是错过了什么?

    根据评论中的要求,以下是我的模型的相关部分:

    # 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)
    

    希望这有帮助。

    2 回复  |  直到 14 年前
        1
  •  2
  •   mlissner    14 年前

    好吧,我终于明白了。上帝啊,有时候解决办法太简单了。

    我需要做的是:

    profileForm = ProfileForm(instance = userProfile)
    

    我做了改变,现在一切都正常了。

        2
  •  2
  •   Chuck    10 年前

    虽然姆利斯纳的回答在某些情况下可能有效,但我认为这不是你想要的。关键字“instance”用于更新现有记录。

    如果您试图使用关键字“initial”,只需将行更改为:

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

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