我想在管理员中提供一种自定义视图 changelist_view(), ,但没有指向编辑表单视图的链接。用户将能够在列表中选择项目并像在“更改列表”表格中的操作一样应用操作,但他们无法访问编辑表格。

我认为ModelAdmin类中的结构应该是这样:

class ProductAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(ProductAdmin, self).get_urls()
        urls += patterns('',
            (r'^selectlist/$', self.selectlist_view)
        )
        return urls

    def selectlist_view(self):
        return render_to_response(...)

要回来的视图与 ModelAdmin.changelist_view(). 。最好和干燥的方法是什么?

有帮助吗?

解决方案

以下自定义ModelAdmin是我到目前为止可以提出的最佳解决方案:

class UserModelAdmin(ModelAdmin):
    def get_urls(self):
        urls = super(UserModelAdmin, self).get_urls()
        info = self.model._meta.app_label, self.model._meta.module_name
        select_list_url = patterns('',
            url(r'^selectlist/$', self.selectlist_view, 
                name='%s_%s_select' % info)
        )
        return select_list_url + urls

    def selectlist_view(self, request, extra_context=None):
        temp_list_display_links = self.list_display_links
        self.list_display_links = (None, )
        response = self.changelist_view(request, extra_context)
        self.list_display_links = temp_list_display_links
        return response

其他提示

我真的不知道为什么,但是我个人倾向于 覆盖(或扩展)更改列表模板 对于特定的模型而不是MonkeyPatching ModelAdmin。

编辑:

谢谢,但是我需要仅通过覆盖模板就无法完成的自定义。例如显示不同的QuerySet,等等。

为了显示不同的QuerySet,您可以超越ModelAdmin.queryset()。

另外,应该无法编辑列出的项目。如果我覆盖模板,则用户将不会看到指向编辑表单的链接,但是如果他可以猜出向表单的URL,他仍然可以访问表单并通过键入URL进行编辑,这将是一个安全孔。

为什么不只是从相关用户中删除编辑权限?您也可以覆盖“添加”和“更改”视图:

class SomeModelAdmin(admin.ModelAdmin):
    ...
    def change_view(self, request, object_id, extra_context=None):
        return render_to_response('forbiden_operation.html', dict(op='edit'))
    def ModelAdmin.add_view(self, request, form_url='', extra_context=None):
        return render_to_response('forbiden_operation.html', dict(op='add'))

这些是“官方”钩子,将来不太可能破裂。

还要记住“管理的禅宗”:

Django的管理界面是为单一活动而设计的:

信任的用户编辑结构化内容。

是的,这非常简单 - 但是简单性是基于许多假设的主机。 Django管理员界面的整个哲学直接遵循这些假设,因此让我们在以下各节中挖掘该短语的潜台词。 “值得信赖的用户……”

管理界面旨在由您,开发人员,信任的人使用。这不仅意味着“经过身份验证的人”;这意味着Django假设您的内容编辑器可以信任做正确的事情。

反过来,这意味着没有编辑内容的批准过程 - 如果您信任用户,则没有人需要批准其编辑。另一个含义是,虽然功能强大,但在本文中,虽然强大,但不支持以每个对象的限制访问。如果您相信某人可以编辑他或她自己的故事,那么您相信该用户不会未经允许编辑其他人的故事。

“……编辑……”

Django管理界面的主要目的是让人们编辑数据。起初这似乎很明显,但是再次产生了一些微妙而强大的影响。

例如,尽管管理员界面对于查看数据(如所述)非常有用,但它并不是考虑到该目的。例如,请注意缺乏“可以查看”权限(请参阅第12章)。 Django假设如果允许人们在管理接口中查看内容,则还允许他们编辑它。

要注意的另一个更重要的事情是,甚至缺乏接近“工作流程”的任何东西。如果给定的任务需要一系列步骤,则不支持执行这些步骤以任何特定的顺序完成。 Django的管理界面专注于编辑,而不是围绕编辑的活动。避免工作流程的避免也源于信任的原则:管理员界面的理念是工作流程是人事问题,而不是代码中要实现的东西。

最后,请注意管理界面中缺乏聚合。也就是说,没有支持显示总数,平均值等。同样,管理接口是用于编辑的 - 预计您将为其余的所有内容编写自定义视图。

“……结构化内容”

与Django的其余部分一样,管理员接口希望您使用结构化数据。因此,它仅支持存储在Django模型中的编辑数据。对于其他任何内容,例如存储在文件系统上的数据,您需要自定义视图。

全停止

到目前为止,应该清楚的是,Django的管理界面并不试图成为所有人的万物。相反,我们选择将重点放在一件事上,并做得很好。

在扩展Django的管理界面时,许多相同的理念都具有(请注意,“可扩展性”在我们的目标中无处显示)。因为自定义Django视图可以做任何事情,并且由于可以轻松地将它们视觉集成到管理界面中(如下一部分所述),所以自定义管理界面的内置机会受到设计的限制。

您应该记住,管理界面是“只是一个应用程序”,尽管非常复杂。它没有做任何充足时间无法再现的Django开发人员的事情。将来,人们完全有可能开发基于不同假设集的不同管理界面,因此行为会有所不同。

最后,我们应该指出,在撰写本文时,Django开发人员正在研究Admin界面的新版本,该版本可以更加灵活地自定义。当您阅读本文时,这些新功能可能已经进入了真正的Django发行。要找出答案,请询问Django社区中的某人是否已集成了“新Forms-Admin”分支。

Admin应用程序已经有了很大的改进,以便在自定义方面具有更大的灵活性,但是恕我直言,“ Admin的Zen”大部分仍然是正确的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top