使用 Django admin 为不同的应用程序在不同的配置中注册相同的模型

Posted

技术标签:

【中文标题】使用 Django admin 为不同的应用程序在不同的配置中注册相同的模型【英文标题】:Registering the same model in different configurations for different apps with Django admin 【发布时间】:2014-12-04 06:08:28 【问题描述】:

我有一个相当大的 CMS,其中包含许多模块,并且正在使用 Django 权限调节访问。每个应用程序都有一个 UserProfile 模型,其中一个 User 对象作为 ForeignKey。我希望能够在每个应用程序中轻松查找和创建 UserProfile 对象。我想使用 Inlines 来做这样的事情(来自 project/app/admin.py):

class InlineModelForUser(admin.TabularInline):
    model = User
    extra=0

class UserSettings(admin.ModelAdmin):
    search_fields = ['username', 'name']
    readonly_fields = ['username','name', 'otherproperites']
    inlines = [InlineModelForUser,]

admin.site.register(User, UserSettings)

返回的错误是:“模型用户已注册”。我理解它发生的原因,并且我很欣赏我可能可以以不同的方式实现相同的功能。我想要实现的是将基本对象(用户)的编辑和附加的应用程序配置文件对象分开。我当然看到我可以在 UserProfile 的 CreateView 中创建一个自动完成字段,但有时您需要为每个应用程序提供不同的过滤工具(过滤/反对用户属性)并且需要向用户隐藏一些用户信息每个应用程序。

基本上:我如何在 django.contrib.admin 中针对同一模型构建多个视图并将其注册到 admin.site.register?

【问题讨论】:

这里仍然缺少的是代理对象需要它自己的一组权限。我不完全确定您将如何最好地实施它。我正在为我正在解决的这个用例手动完成它,但如果我发现一些优雅的东西会报告。 【参考方案1】:

找到this,它部分回答了这个难题:

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pubdate','user')

class MyPosts(Post):
    class Meta:
        proxy = True

class MyPostAdmin(PostAdmin):
    def queryset(self, request):
        return self.model.objects.filter(user = request.user)

admin.site.register(Post, PostAdmin)
admin.site.register(MyPost, MyPostAdmin)

【讨论】:

以上是关于使用 Django admin 为不同的应用程序在不同的配置中注册相同的模型的主要内容,如果未能解决你的问题,请参考以下文章

将 Django 管理表单放在不同的文件中

在搜索字段中正确使用外键引用,Django admin

Django admin 不同的内联用于更改和添加视图

django admin实现后台多用户隔离

如何在Django Admin中将ImageField限制为几个选项

django-admin小试