【问题标题】:How to add information from another model to admin edit page如何将来自另一个模型的信息添加到管理员编辑页面
【发布时间】:2014-06-27 18:12:11
【问题描述】:

我有 2 个模型。 第一个模型包含用户字段和文件字段(文件地址)。一个用户只能是一个文件。 第二个模型是一样的,但它是某种存档文件。因此,一个用户可能有很多文件。

我想为同一用户添加来自第二个模型的存档文件的链接的管理员编辑第一个模型页面列表。 我怎么能这样做?什么是最好的方法?我应该重新定义管理模型模板和视图吗?

例子:

用户 - 名称

文件 - 到文件的链接

存档文件:

文件1的链接

文件2的链接

...

链接到文件 N

统一更新: 我的模型如下所示:

class UserFile(models.Model):
    user = models.ForeignKey(User)
    file = PrivateImageField(...)

class ArchivedUserFile(models.Model):
    user = models.ForeignKey(User)
    file = PrivateImageField(...)

【问题讨论】:

  • 当我这样做时很遗憾,我的第二个模型(存档)没有第一个模型的外键。

标签: django django-admin


【解决方案1】:

听起来你想使用 Django 的内联管理员。表格内联非常易于使用且功能齐全。

所以对于这段代码:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=100)

您可以注册这些管理员来管理作者和他们创建的书籍:

from django.contrib import admin

class BookInline(admin.TabularInline):
    model = Book

class AuthorAdmin(admin.ModelAdmin):
    inlines = [
        BookInline,
    ]

别忘了注册你的管理员

from django.contrib import admin
admin.site.register(Author, AuthorAdmin)

这一切都是从

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects

如果您只想自己管理,可以编辑模板。别 忘记将您的迭代器/查询集放入上下文中,以便您可以使用它。

查看相关文档。

https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#overriding-admin-templates https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options

并覆盖您的 admin.ModelAdmin 上的 change_view 方法:

def change_view(self, request, object_id, form_url='', extra_content=None):
    // Set up vars
    context = {'things': list_of_things}

    return super(AuthorAdmin, self).change_view(request, object_id, form_url, context)

【讨论】:

  • 我想使用内联方法,但我不能。在您的示例中,您在两个模型之间有 ForeignKey 链接,我的模型如下所示: class UserFile(models.Model): user = models.ForeignKey(User) file = PrivateImageField(...) class ArchivedUserFiles(models.Model): user = models.ForeignKey(User) file = PrivateImageField(...) 很快就会尝试第二种方法...
【解决方案2】:

你没有理由不能在这里使用内联。主要的绊脚石是 User 模型会自动在管理员中注册。让你的 ModelAdmins 如下:

...
from django.contrib.auth import User
...


class UserFileInline(admin.TabularInline):
    model = UserFile


class ArchivedUserFileInline(admin.TabularInline):
    model = ArchivedUserFile


class UserAdmin(admin.ModelAdmin):
    inlines = (
        UserFileInline,
        ArchivedUserFileInline,
    )


# Unregister User from the admin and re-register with our ModelAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

现在您可以在用户管理员中使用您的文件了。

【讨论】:

  • 如何将不同应用程序的内联内容混合到同一个模型中。比如User Model在其他应用中可能有很多关系,都需要添加内联?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多