【问题标题】:Django admin inlines on default list page?默认列表页面上的 Django 管理员内联?
【发布时间】:2013-01-17 07:32:52
【问题描述】:

我有一个表,其中只有少数条目,如果我可以在他们的列表中使用内联而不是强迫员工每次都点击进入编辑页面,那就太好了。

也就是说,当用户单击通常会提供模型对象列表的链接时,他们应该会看到内联显示的模型对象。

我尝试过这样的事情,但不出所料,它给出了一个错误,因为没有外键:

class MyModelInline(admin.StackedInline): 
    model = MyModel               

class MyModelAdmin(admin.ModelAdmin): 
    inlines = [MyModelInline,]    

admin.site.register(MyModel, MyModelAdmin)

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    要让它像您描述的那样工作,您需要一个“编辑器”模型作为数据的父级。您要显示的所有行都应该有一个指向单个“编辑器”模型对象的外键。所以,在models.py中:

    from django.db import models
    
    class Editor(models.Model):
        pass
    
    class MyModel(models.Model):
        name = models.CharField(max_length=100) # Field added for demonstration
        # ... add any other fields you like ...
        editor = models.ForeignKey(Editor)
    

    在 admin.py 中:

    from django.contrib import admin
    from Test.models import Editor, MyModel
    
    class MyModelInline(admin.StackedInline):
        model = MyModel
    
    class EditorAdmin(admin.ModelAdmin):
        inlines = [MyModelInline,]
    admin.site.register(Editor, EditorAdmin)
    

    需要考虑的其他事项:

    当您以编程方式创建新的 MyModel() 对象时,您必须始终将外键设置为指向编辑器。应该只有一个编辑器实例才能按照您的描述工作。使用管理界面时,应使用编辑器对象的管理页面自动设置此外键。我建议在生产中限制除您自己之外的所有人创建和删除编辑器对象。如果有人删除了编辑器对象,那么所有 MyModel 对象也会消失。


    备选方案:

    1) 如果管理员所做的编辑很简单,那么我会推荐implementing "actions"

    2) 还有overriding the admin template 的可能性。我个人不太喜欢这个选项,因为每次更新 Django 时,我都必须检查我的更改是否不会干扰新功能。但是,有时这是在管理界面中执行一些更高级操作的唯一方法。我已经在自己的项目中完成了这项工作,但希望尽量减少更改。

    【讨论】:

    • 谢谢,但这不会给 MyModel 添加不必要的列吗? (还有不必要的 Editor 表,但因为它很小,所以更容易接受。)
    • 出于演示目的,我添加了“名称”字段。您的代码中不需要它。我只是想在“MyModel”类中添加一些东西以确保测试代码正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多