Django管理外键值自定义表单

时间:2016-10-18 09:20:07

标签: python django

所以,我有一个模型拼图和模型片。作为外国人对拼图的关键。在管理员上,在拼图表单上添加一个新元素,我有一个stackInLine for pieces。但是如果我从作品中输入所有数据,我只能添加更多。有没有办法通过选择已经存储在DB上的Piece值的下拉列表来为拼图添加新的Pieces?我谷歌永远都没找到......谢谢。所以我拥有的是:

class Puzzle(models.Model):
     name = models.CharField(max_length=200)

class Piece(models.Model):
     name = models.CharField(max_length=200)
     puzzle = models.ForeignKey(Puzzle, null=True)

在django后端,当我编辑拼图时,我想从存储在数据库中的所有Piece模型的下拉菜单中选择"分配"他们对我目前的谜题进行了编辑。这可能吗?我现在正在使用:

class PieceInline(admin.StackedInline):
      model = Piece
      extra = 1
class PuzzleAdmin(admin.ModelAdmin):
      model = Piece
      inlines = (PieceInLine, )

所以我在拼图形式上有一个堆叠的线条,但我只能创建新的......

1 个答案:

答案 0 :(得分:1)

如果您创建新模型,请说:

from django.dispatch import receiver


class PieceSelector(models.Model):
    piece = models.ForeignKey(Piece)

    def __unicode__(self):
        return piece.some_field

@receiver(post_save, sender=Piece)
def piece_post_save_signal_receiver(sender, **kwargs):
    if kwargs['created']:
        PieceSelector.objects.create(piece=kwargs['instance'])

现在,当您创建Piece模型对象时,您也应该创建PieceSelector对象。您可以使用Piece模型的post_save信号来完成它,它将在下拉列表中提供所有部分。

在admin.py中,使用PieceSelector作为Puzzle模型的StackedInline。