如何添加从一个对象的 Django 管理页面到相关对象的管理页面的链接? [英] How do I add a link from the Django admin page of one object to the admin page of a related object?

查看:20
本文介绍了如何添加从一个对象的 Django 管理页面到相关对象的管理页面的链接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为了解决 django-admin 中缺乏嵌套内联的问题,我已将特殊情况放入两个模板中,以在两个模型的管理员更改页面和内联管理员之间创建链接.

To deal with the lack of nested inlines in django-admin, I've put special cases into two of the templates to create links between the admin change pages and inline admins of two models.

我的问题是:如何干净地创建从一个模型的管理更改页面或内联管理到相关模型的管理更改页面或内联管理的链接,模板中没有讨厌的黑客攻击?

我想要一个通用的解决方案,我可以将其应用于任何模型的管理更改页面或内联管理.

I would like a general solution that I can apply to the admin change page or inline admin of any model.

我有一个模型,post(不是它的真名),它既是 blog 管理页面的内嵌,也有自己的管理页面.它不能只是内联的原因是它有带有外键的模型,只有在用它编辑时才有意义,而且只有在用 blog 编辑时才有意义.

I have one model, post (not its real name) that is both an inline on the blog admin page, and also has its own admin page. The reason it can't just be inline is that it has models with foreign keys to it that only make sense when edited with it, and it only makes sense when edited with blog.

对于 post 管理页面,我将fieldset.html"的一部分从:

For the post admin page, I changed part of "fieldset.html" from:

{% if field.is_readonly %}
    <p>{{ field.contents }}</p>
{% else %}
    {{ field.field }}
{% endif %}

{% if field.is_readonly %}
    <p>{{ field.contents }}</p>
{% else %}
    {% ifequal field.field.name "blog" %}
        <p>{{ field.field.form.instance.blog_link|safe }}</p>
    {% else %}
        {{ field.field }}
    {% endifequal %}
{% endif %}

创建一个到 blog 管理页面的链接,其中 blog_link 是模型上的一个方法:

to create a link to the blog admin page, where blog_link is a method on the model:

def blog_link(self):
      return '<a href="%s">%s</a>' % (reverse("admin:myblog_blog_change",  
                                        args=(self.blog.id,)), escape(self.blog))

我在 field.field.form.instance 之外的任何地方都找不到 blog 实例的 id.

I couldn't find the id of the blog instance anywhere outside field.field.form.instance.

blog 管理页面上,post 是内联的,我修改了stacked.html"的一部分:

On the blog admin page, where post is inline, I modified part of "stacked.html" from:

<h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;
<span class="inline_label">{% if inline_admin_form.original %}
    {{ inline_admin_form.original }}
{% else %}#{{ forloop.counter }}{% endif %}</span>

<h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;
<span class="inline_label">{% if inline_admin_form.original %}
    {% ifequal inline_admin_formset.opts.verbose_name "post" %}
    <a href="/admin/myblog/post/{{ inline_admin_form.pk_field.field.value }}/">
            {{ inline_admin_form.original }}</a>
{% else %}{{ inline_admin_form.original }}{% endifequal %}
{% else %}#{{ forloop.counter }}{% endif %}</span>

创建一个指向 post 管理页面的链接,因为在这里我能够找到存储在外键字段中的 id.

to create a link to the post admin page since here I was able to find the id stored in the foreign key field.

我确信有一种更好、更通用的方法来添加到管理表单的链接,而无需重复我自己;它是什么?

推荐答案

Django 1.8 的新功能:show_change_link 用于内联管理员.

New in Django 1.8 : show_change_link for inline admin.

在您的内联模型中将 show_change_link 设置为 True(默认情况下为 False),以便内联对象具有指向其更改表单的链接(在那里它们可以拥有自己的内联).

Set show_change_link to True (False by default) in your inline model, so that inline objects have a link to their change form (where they can have their own inlines).

from django.contrib import admin

class PostInline(admin.StackedInline):
    model = Post
    show_change_link = True
    ...

class BlogAdmin(admin.ModelAdmin):
    inlines = [PostInline]
    ...

class ImageInline(admin.StackedInline):
    # Assume Image model has foreign key to Post
    model = Image
    show_change_link = True
    ...

class PostAdmin(admin.ModelAdmin):
    inlines = [ImageInline]
    ...

admin.site.register(Blog, BlogAdmin)
admin.site.register(Post, PostAdmin)

这篇关于如何添加从一个对象的 Django 管理页面到相关对象的管理页面的链接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆