如何从模型的外键角度显示Django admin中的相关对象?

Tho*_*hom 3 python django django-admin

我得到了两个由外键链接的 Django 模型:

class Author(models.Model):
    ...

class Book(models.Model):
    author = models.ForeignKey(Author)
Run Code Online (Sandbox Code Playgroud)

请考虑下面的管理示例(我想做相反的事情):

from django.contrib import admin
from my_app.models import Author, Book

class BookInline(admin.TabularInline):
    model = Book

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

admin.site.register(Author, AuthorAdmin)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们可以在管理中看到所有作者,以及每个作者的书。

现在,我想反过来。在管理中为每本书输入 en 条目,并在书籍详细信息中显示作者信息(可以是只读的)。我尝试了下面的解决方案,但显然它不起作用:

from django.contrib import admin
from my_app.models import Author, Book

class AuthorInline(admin.TabularInline):
    model = Author

class BookAdmin(admin.ModelAdmin):
    inlines = [
        AuthorInline,
    ]

admin.site.register(Book, BookAdmin)
Run Code Online (Sandbox Code Playgroud)

Django 引发了一个错误:

<class 'my_app.admin.AuthorInline'>: (admin.E202) 'my_app.Author' has no ForeignKey to 'my_app.Book'.

你知道怎么做吗 ?

更多背景:

  • Django 1.11
  • 我想将 Book 和 Author 显示为完全只读,因此不会更改 Book 的外键(至少不会从管理员更改)

Tho*_*hom 5

这是我的解决方案,也许不是最好的,但它有效!:)

这个想法是改变模板,因此能够以我想要的方式显示它。

管理.py:

class BookAdmin(admin.ModelAdmin):
    ...
    change_form_template = 'admin/book_details.html'

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context['book'] = Book.objects.get(id=object_id)
        extra_context['author'] = extra_context['book'].author

        return super().change_view(request, object_id, form_url, extra_context=extra_context)

admin.site.register(Book, BookAdmin)
Run Code Online (Sandbox Code Playgroud)

对于模板,我只是从 admin复制/过去模板 change_form.html

管理员/book_details.html:

{% extends "admin/base_site.html" %}
{% load i18n admin_urls static admin_modify %}


{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %}

{% block coltype %}colM{% endblock %}

{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; {% if has_change_permission %}<a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %}
&rsaquo; {% if add %}{% blocktrans with name=opts.verbose_name %}Add {{ name }}{% endblocktrans %}{% else %}{{ original|truncatewords:"18" }}{% endif %}
</div>
{% endblock %}


{% block content %}

# Display here want you want !

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我查看了 Django 管理员的模板,以便能够以与默认模板显示的方式相同的方式显示我的 Book 和 Author。所以我的用户不会被这个观点打扰。

如果您找到更好的方法,请告诉我!:)