【发布时间】:2012-04-12 18:28:06
【问题描述】:
为了处理 django-admin 中的 lack of nested inlines,我将特殊情况放入了两个模板中,以在两个模型的管理员更改页面和内联管理员之间创建链接。
我的问题是:如何干净利落地创建从一个模型的管理员更改页面或内联管理员到相关模型的管理员更改页面或内联管理员的链接,而不会在模板中出现讨厌的黑客攻击?强>
我想要一个通用的解决方案,我可以将其应用于任何模型的管理员更改页面或内联管理员。
我有一个模型,post(不是它的真名),它既是 blog 管理页面上的内联模型,也有自己的管理页面。它不能只是内联的原因是它具有带有外键的模型,只有在使用它编辑时才有意义,并且只有在使用 blog 编辑时才有意义。
对于post 管理页面,我将“fieldset.html”的一部分从:
{% 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 是模型上的一个方法:
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。
在blog 管理页面上,post 是内联的,我从以下位置修改了“stacked.html”的一部分:
<h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>
<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>
<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。
我确信有一种更好、更通用的方法可以在不重复自己的情况下添加管理表单的链接;这是什么?
【问题讨论】:
-
试图解决同样的问题,以下解决方案在 python 3/django 1.6 上对我没有帮助。不过This post确实很好地解决了问题,我想分享一下。
-
@rara_tiru 好链接!谢谢。这解决了几乎相同的问题,希望我在问这个问题之前找到它。
标签: python django django-models django-admin django-templates