为什么Django通过模型为自定义创建堆叠元素

时间:2013-11-30 13:45:51

标签: python django

我自己的关系表并使用through参数映射两个模型。参见:

models.py

class Term(models.Model):
    title = models.CharField(max_length=32)
    class Meta:
        db_table = "tbl_term"

class Post(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()

    terms = models.ManyToManyField("Term", through="Term_Post_Map")

    class Meta:
        db_table = "tbl_post"

class Term_Post_Map(models.Model):
    term = models.ForeignKey("Term", db_column="id_term")
    post = models.ForeignKey("Post", db_column="id_post")
    class Meta:
        db_table = "tbl_term_post_map"

admin.py

class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content', 'terms']})
    ]

以上脚本引发此错误:

  

' AdminPost.fieldsets [0] [1] ['字段']'不能包含ManyToManyField字段' terms'因为'术语'手动指定一个'到'模型。

当我从'terms'移除fieldsets并添加到inlines时,它就有效:

class TermInline(admin.TabularInline):
    model = Term_Post_Map
    fields = ["term"]
    extra = 1

class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content']})
    ]
    inlines = [TermInline]

但我不希望以表格或堆叠格式显示,如下所示: enter image description here

为什么不会出现在单个ListBox元素中:

当我不使用我自己的through模型映射两个模型时,它会出现在单个ListBox元素中。像这样: enter image description here

1 个答案:

答案 0 :(得分:1)

Django建议在指定through模型时使用内联,因为中间表通常具有额外的字段,这些字段无法在多个选择框中表示。

在您的示例中,您没有任何额外字段,因此最简单的方法是不指定直通模型。然后,您可以使用多选小部件。

您可能必须使用through模型,例如您可能正在使用旧数据库。不幸的是,我不知道在这种情况下启用多选小部件的快速方法。