【问题标题】:Django Admin: Show list of modelsDjango Admin:显示模型列表
【发布时间】:2016-04-23 06:33:47
【问题描述】:

我正在使用Django 1.8.8

我有很多这样定义的模型:

class MainModel(models.Model):
    value = models.IntegerField(null=False, editable=True, default=20)
    dt_modified = models.DateTimeField(null=True, auto_now=True)

class MyModel1(MainModel, models.Model):
    name = models.CharField(null=False, editable=False, max_length=50)

class MyModel2(MainModel, models.Model):
    foo = models.CharField(null=False, editable=False, max_length=50)

我的管理页面目前是这样设置的,

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('value', 'dt_modified')
    search_fields = ['value']
    date_hierarchy = 'dt_modified'

models = [MyModel1, MyModel2]
admin.site.register(models, MyModelAdmin)

我想按如下方式设置我的管理页面: 在首页有一个链接/admin,“MainModels”,它引导我到另一个页面,我可以从MyModel 的所有派生模型列表中进行选择,即[MyModel1, MyModel2, ....MyMoneyN],它可以让我编辑选定的派生模型。 MyModel#

上面代码的问题是它为每个编号的模型创建了一个顶级链接。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您最好使用Grapelli 之类的东西或其他自定义管理员替换。您可以使用不同的模型集设置自定义页面,默认调整隐藏/显示等。尝试使用 vanilla admin 执行此操作会出现问题。

    这是一个与您想用 grappelli 做的事情接近的例子

    from django.core.urlresolvers import reverse
    from django.utils.translation import ugettext_lazy as _
    from grappelli.dashboard import modules, Dashboard
    
    class MyDashboard(Dashboard):
        def __init__(self, **kwargs):
            Dashboard.__init__(self, **kwargs)
    
            # append an app list module for "Applications"
            self.children.append(modules.AppList(
                title=_('Applications'),
                column=1,
                css_classes=('grp-collapse grp-closed',),
                collapsible=True,
                exclude=('django.contrib.*',),
            ))
    

    【讨论】:

    • 你能举个例子吗?
    • 查看Grapellidjango-suit 文档以获取示例。但在更一般的层面上,您应该考虑为什么要将管理应用程序用于generic viewsModelForms 似乎最合适的用例。
    • 一个很好的建议/评论...但这不是问题的答案。
    【解决方案2】:

    您需要自己的更改列表来执行此操作:

    class MyChangeList(ChangeList):
        def url_for_result(self, result):
            link = your_function_to_create_link()
            return link
    

    然后在ModelAdmin 中使用您的Changelist

    class MyModelAdmin(admin.ModelAdmin):
        def get_changelist(self, request, **kwargs):
            return MyChangeList
    

    【讨论】:

    • your_function_to_create_link() 会包含什么内容?
    • 这取决于你想做什么。我想你正在使用 Django admin 并且你想要一个指向派生模型对象的链接。在这种情况下,它可能是这样的:reverse("admin:%s_%s_change" % (result._meta.app_label, result._meta.model_name))。它将为每个对象更改视图构造一个正确的 url。 result 这是你的对象。
    • 我进行了更改,当我运行时,makemigrations 显示未检测到更改。
    • 您没有更改模型中的任何内容,您不需要迁移
    • 在顶级/admin 页面上,在我进行更改后,我仍然看到每个模型的 1 个链接?也许我错过了什么。
    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2012-07-05
    • 2011-02-25
    • 2014-05-15
    • 2019-10-20
    • 2018-12-12
    相关资源
    最近更新 更多