【问题标题】:Content type dropdown not displayed django admin form内容类型下拉菜单未显示 django 管理表单
【发布时间】:2017-03-23 07:18:58
【问题描述】:

这是一个帖子模型,当我在 django admin 中打开它以添加帖子时,我看到一个字段内容类型,但不存在用于选择内容类型的下拉菜单。我在这里做错了吗?

class Post(models.Model):

    FEATURE_LIMITS = models.Q(app_label=u'forums', model=u'forum')

    content_type = models.ForeignKey(ContentType, limit_choices_to=FEATURE_LIMITS, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

admin.py 用于帖子

# imports

admin.site.register(posts_models.Post)

有一个模型论坛,它与帖子有一个通用的关系。

class Forum(models.Model):
    # other fields
    posts = GenericRelation(Post)

post 字段在 django admin 上不可见(其他字段可见)。

admin.py 用于论坛

# imports

admin.site.register(forums_models.Forum)

如果我对 admin.py 进行更改:

class PostInline(GenericTabularInline):
    model = Post

class ForumAdmin(admin.ModelAdmin):
    inlines = [
        PostInline,
    ]

admin.site.register(forums_models.Forum, ForumAdmin)

然后点击http://localhost:8000/admin/forums/forum/add/,页面将永远加载。

【问题讨论】:

  • 但是为什么只需要为一个模型创建通用关系呢?泛型关系对那些东西没有效率..
  • 我希望将来肯定会添加更多模型。

标签: python django


【解决方案1】:

您的应用程序似乎配置错​​误。

我的项目结构

app
|-settings/
|-forums/
|--models.py
|--admin.py
|-posts/
|--models.py
|--admin.py

所以 posts/models.py

class Post(models.Model):
    FEATURE_LIMITS = models.Q(app_label='forums', model='forum')

    name = models.CharField(max_length=100)

    content_type = models.ForeignKey(ContentType, limit_choices_to=FEATURE_LIMITS, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

posts/admin.py

from .models import Post

class PostInline(GenericTabularInline):
    model = Post

论坛/models.py

class Forum(models.Model):
    # other fields
    name = models.CharField(max_length=100)
    posts = GenericRelation('posts.Post')

论坛/admin.py

from .models import Forum
from posts.admin import PostInline

@admin.register(Forum)
class ForumAdmin(admin.ModelAdmin):
    inlines = [
        PostInline,
    ]

一切都像魅力一样。

我猜你有无限循环,因为试图在错误的应用程序中注册模型。(应用程序posts 中的模型Forum

【讨论】:

  • 我正在处理它,这是一个复制粘贴,因此可能会有错误,不用担心目录结构,这很好。我已经覆盖了 django admin,这就是罪魁祸首。
  • @rohanagarwal 我自己尝试过该解决方案并且它正在工作(只是为了让您知道这不是一些未经尝试就编写的代码)
  • 你是对的。我知道您编写的代码有效,因为您使用的是 django.contrib.admin。我已经覆盖了这个管理员,因此出现了问题。如果我在新项目中编写问题中的代码,那也将起作用,因为 admin 在新项目中不会被覆盖。 这是复制粘贴,因此可能有错误是针对我发布的代码,因为我无法发布原始代码
【解决方案2】:

我使用的是admin.widgets.ForeignKeyRawIdWidgetwidget,它阻止了外键字段正常显示。自从

content_type = models.ForeignKey(ContentType, limit_choices_to=FEATURE_LIMITS, on_delete=models.CASCADE)

content_type 是外键字段,没有下拉菜单。 为防止这种情况发生,请在 admin.py 中进行以下更改:

class PostAdmin(admin.ModelAdmin):
    raw_id_field_excludes = 'content_type'

admin.site.register(Post, PostAdmin)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-06-18
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多