Django管理界面:显示模型列表

7

我正在使用 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#
上述代码的问题是它为每个编号模型创建了一个顶级链接。
2个回答

2

您最好使用像Grapelli或其他自定义管理界面替代品。您可以设置具有不同模型集的自定义页面,调整默认隐藏/显示等。尝试使用原始管理员进行此操作将会出现问题。

这是一个类似于使用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.*',),
        ))

你能提供一个例子吗? - pyCthon
1
请查看Grapellidjango-suit文档以获取示例。但更一般地,您应该考虑为什么要在使用ModelForms的情况下使用通用视图(generic views)来使用管理应用程序。 - jnns
1
一个好的建议/评论...但这不是问题的答案。 - rnevius

1
你需要自己的变更列表来完成这个任务:
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()函数需要包含什么内容? - pyCthon
1
这取决于你想做什么。我猜你正在使用Django管理界面,并且想要一个链接到派生模型对象的链接。在这种情况下,代码可能如下所示:reverse("admin:%s_%s_change" % (result._meta.app_label, result._meta.model_name))。它将为每个对象构造正确的更改视图URL。这里的result是你的对象。 - Karolis Ryselis
我进行了更改,但当我运行“makemigrations”时,它显示未检测到更改。 - pyCthon
你没有改变模型中的任何内容,不需要进行迁移。 - Karolis Ryselis
在顶层的/admin页面上,我在您的更改后仍然看到每个模型的1个链接?也许我漏掉了什么。 - pyCthon
是的,抱歉,我在链接函数创建方面是错误的。我使用的是Django 1.7,可以这样做。如果你有一个基类MainModel和派生模型MyModel1MyModel2,你的result对象将有result.mymodel1result.mymodel2,具体取决于它是什么对象。如果你测试这些属性,你可以在result.mymodel1result.mymodel2上调用reverse。如果你对此有更多问题,请让我知道。 - Karolis Ryselis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接