django - inlineformset_factory与多个外键一起使用

19 投票
1 回答
4989 浏览
提问于 2025-04-15 18:33

我正在尝试使用以下模型来创建一个表单集(boost是主要的模型):

class boost(models.Model):
   creator = models.ForeignKey(userInfo)
   game  = models.ForeignKey(gameInfo)
   name  = models.CharField(max_length=200)
   desc  = models.CharField(max_length=500)
   rules = models.CharField(max_length=500)
   subscribe = models.IntegerField(default=0)

class userInfo(models.Model):
   pic_url= models.URLField(default=0, blank=True)
   auth   = models.ForeignKey(User, unique=True)
   birth  = models.DateTimeField(default=0, blank=True)
   country= models.IntegerField(default=0, blank=True)

class gameInfo(models.Model):
   psn_id = models.CharField(max_length=100)
   name   = models.CharField(max_length=200)
   publisher = models.CharField(max_length=200, default=0)
   developer = models.CharField(max_length=200, default=0)
   release_date = models.DateTimeField(blank=True, null=True)

我想显示一个表单来添加一个Boost项目,尝试这样做:

TrophyFormSet = inlineformset_factory(db.gameInfo, db.boost, extra=1)
formset = TrophyFormSet()

我有几个问题:

1 - 当表单显示时,“创建者”的下拉框里显示的是“db.userInfo”的列表(字面意思)!我希望它能显示数据库中已经存在的db.userInfo.auth.username...我该怎么做呢?

2 - 这样的话,我的“db.gameInfo”在哪里可以选择呢?

谢谢!=D

======

czarchaic很好地回答了我的问题!但现在我还有一个小问题:

当我使用modelform为boost_trophy模型创建表单时:

class boost_trophy(models.Model):
   boost  = models.ForeignKey(boost)
   trophy = models.ForeignKey(gameTrophyInfo)
   # 0 - Obtiveis
   # 1 - Requisitos minimos
   type   = models.IntegerField(default=0)

class gameTrophyInfo(models.Model):
   game = models.ForeignKey(gameInfo)
   name = models.CharField(max_length=500)
   desc = models.CharField(max_length=500)
   type = models.CharField(max_length=20)

它运行得很好,但我希望“游戏”框中只显示一小部分项目,仅显示:gameTrophyInfo(game__name="Game_A")的结果。我该怎么做呢?

1 个回答

12

如果我理解得没错的话:

要改变显示的内容,可以设置模型的 __unicode__ 函数。

class userInfo(models.Model):
  #model fields

  def __unicode__(self):
    return self.auth.username

撰写回答