45

トッピングクラスとピザクラスを備えたピザアプリケーションがあり、DjangoAdminに次のように表示されているとします。

PizzaApp
-
Toppings      >>>>>>>>>>      Add / Change

Pizzas        >>>>>>>>>>      Add / Change

しかし、私はそれらをこのようにしたいと思います:

PizzaApp
-
Pizzas        >>>>>>>>>>      Add / Change

Toppings      >>>>>>>>>>      Add / Change

admin.pyでそれを構成するにはどうすればよいですか?

4

21 に答える 21

46

試すことができる回避策は、models.py を次のように微調整することです。

class Topping(models.Model):
    .
    .
    .
    class Meta:
        verbose_name_plural = "2. Toppings"

class Pizza(models.Model):
    .
    .
    .
    class Meta:
        verbose_name_plural = "1. Pizzas"

django のベスト プラクティスに反しているかどうかはわかりませんが、動作します (django トランクでテスト済み)。

幸運を!

PS: この回答の投稿が遅すぎた場合は申し訳ありませんが、将来の同様の状況で他の人を助けることができます.

于 2011-03-17T21:56:30.237 に答える
29

これを 10 秒で解決したい場合は、verbose_name_plural にスペースを使用してください。たとえば、次のようになります。

class Topping(models.Model):
    class Meta:
        verbose_name_plural = "  Toppings" # 2 spaces

class Pizza(models.Model):
    class Meta:
        verbose_name_plural = " Pizzas" # 1 space

もちろん、それは洗練されたものではありませんが、より良い解決策が得られるまでしばらくは機能する可能性があります。

于 2011-10-19T18:33:53.173 に答える
22

私は最終的にこのDjango snippetのおかげでそれを行うことができました。設定に注意する必要がありADMIN_REORDERます:

ADMIN_REORDER = (
    ('app1', ('App1Model1', 'App1Model2', 'App1Model3')),
    ('app2', ('App2Model1', 'App2Model2')),
)

app1プロジェクト名の前に を付けてはなりません。つまりapp1mysite.app1.

于 2012-03-08T20:38:20.563 に答える
19

そのための素晴らしい Django パッケージがあります。

https://pypi.python.org/pypi/django-modeladmin-reorder

于 2015-09-14T19:56:47.870 に答える
13

これは実際には、最初の Django アプリの作成、パート 7 の一番下で説明されています。

関連するセクションは次のとおりです。

管理者のインデックス ページをカスタマイズする

同様に、Django 管理インデックス ページのルック アンド フィールをカスタマイズすることもできます。

デフォルトでは、管理アプリケーションに登録されている INSTALLED_APPS 内のすべてのアプリがアルファベット順に表示されます。レイアウトを大幅に変更したい場合があります。結局のところ、インデックスはおそらく管理者にとって最も重要なページであり、使いやすいはずです。

カスタマイズするテンプレートは admin/index.html です。(前のセクションの admin/base_site.html と同じように、デフォルト ディレクトリからカスタム テンプレート ディレクトリにコピーします。) ファイルを編集すると、app_list というテンプレート変数が使用されていることがわかります。この変数には、インストールされているすべての Django アプリが含まれています。それを使用する代わりに、オブジェクト固有の管理ページへのリンクを、最適と思われる方法でハードコードすることができます。

于 2008-12-29T18:41:12.610 に答える
6

以下は Emmanuel が使用したスニペットで、Django 1.8 用に更新されています。

templatetags/admin_reorder.py で:

from django import template
from django.conf import settings
from collections import OrderedDict

register = template.Library()

# from http://www.djangosnippets.org/snippets/1937/
def register_render_tag(renderer):
    """
    Decorator that creates a template tag using the given renderer as the 
    render function for the template tag node - the render function takes two 
    arguments - the template context and the tag token
    """
    def tag(parser, token):
        class TagNode(template.Node):
            def render(self, context):
                return renderer(context, token)
        return TagNode()
    for copy_attr in ("__dict__", "__doc__", "__name__"):
        setattr(tag, copy_attr, getattr(renderer, copy_attr))
    return register.tag(tag)

@register_render_tag
def admin_reorder(context, token):
    """
    Called in admin/base_site.html template override and applies custom ordering
    of apps/models defined by settings.ADMIN_REORDER
    """
    # sort key function - use index of item in order if exists, otherwise item
    sort = lambda order, item: (order.index(item), "") if item in order else (
        len(order), item)
    if "app_list" in context:
        # sort the app list
        order = OrderedDict(settings.ADMIN_REORDER)
        context["app_list"].sort(key=lambda app: sort(order.keys(),
            app["app_url"].strip("/").split("/")[-1]))
        for i, app in enumerate(context["app_list"]):
            # sort the model list for each app
            app_name = app["app_url"].strip("/").split("/")[-1]
            if not app_name:
                app_name = app["name"].lower()
            model_order = [m.lower() for m in order.get(app_name, [])]
            context["app_list"][i]["models"].sort(key=lambda model:
            sort(model_order, model["admin_url"].strip("/").split("/")[-1]))
    return ""

settings.py で:

ADMIN_REORDER = (
    ('app1', ('App1Model1', 'App1Model2', 'App1Model3')),
    ('app2', ('App2Model1', 'App2Model2')),
)

(ここに独自のアプリ名を挿入します。管理者は、各アプリに少なくとも 2 つのモデルをリストする限り、不足しているアプリまたはモデルをリストの最後に配置します。)

base_site.html のコピー:

{% extends "admin/base.html" %}
{% load i18n admin_reorder %}

{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}

{% block branding %}
{% admin_reorder %}
<h1 id="site-name">{% trans 'Django administration' %}</h1>
{% endblock %}

{% block nav-global %}{% endblock %}
于 2015-05-15T02:37:34.233 に答える
3

また、 「Django Admin Index Custom App& ModelOrdering」と呼ばれる小さなコードを使用することもできます。スニペットは、たった3つの簡単な編集で問題を解決します。

詳細はこちらをご覧ください。 http://djangosnippets.org/snippets/2613/

于 2012-01-18T14:04:15.630 に答える
2

AdminSite にSuitを使用している場合は、 menu タグを使用してメニューのカスタマイズを行うことができます。

于 2013-11-06T13:12:55.640 に答える
2

管理パネルで名前でアプリを注文できるシンプルなソリューションを探していました。次のテンプレートタグを思いつきました:

from django import template
from django.conf import settings
register = template.Library()

@register.filter
def sort_apps(apps):
    apps.sort(
        key = lambda x:
        settings.APP_ORDER.index(x['app_label'])
        if x['app_label'] in settings.APP_ORDER
        else len(apps)
    )
    print [x['app_label'] for x in apps]
    return apps

templates/admin/index.html次に、そのテンプレート タグをオーバーライドして追加します。

{% extends "admin/index.html" %}
{% block content %}
{% load i18n static sort_apps %}
<div id="content-main">

{% if app_list %}
    {% for app in app_list|sort_apps %}
        <div class="app-{{ app.app_label }} module">
        <table>
        <caption>
            <a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a>
        </caption>
        {% for model in app.models %}
            <tr class="model-{{ model.object_name|lower }}">
            {% if model.admin_url %}
                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
            {% else %}
                <th scope="row">{{ model.name }}</th>
            {% endif %}

            {% if model.add_url %}
                <td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td>
            {% else %}
                <td>&nbsp;</td>
            {% endif %}

            {% if model.admin_url %}
                <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
            {% else %}
                <td>&nbsp;</td>
            {% endif %}
            </tr>
        {% endfor %}
        </table>
        </div>
    {% endfor %}
{% else %}
    <p>{% trans "You don't have permission to edit anything." %}</p>
{% endif %}
</div>
{% endblock %}

次にAPP_ORDER、settings.py で次のようにカスタマイズします。

APP_ORDER = [
    'app1',
    'app2',
    # and so on...
]

Django 1.10でうまく機能します

于 2016-12-04T19:35:15.540 に答える
2

私はそれを Django のトラックに追加しました:

http://code.djangoproject.com/ticket/9928

于 2008-12-29T18:40:15.810 に答える
0

これは暗闇の中での野蛮な刺し傷ですが、admin.site.register(<Model class>、<ModelAdmin class>)を呼び出す順序によって、表示順序が決まる可能性はありますか?実際、Djangoは、反復順序を維持しない標準のPythonディクショナリとして実装されたModel-> ModelAdminオブジェクトのレジストリを維持していると思うので、それが機能するとは思えません。

それが希望どおりに動作しない場合は、いつでもdjango / contrib/adminのソースを試してみることができます。反復順序を維持する必要がある場合は、AdminSiteクラス(admin / sites.py内)の_registryオブジェクトを、キーの挿入順序を維持するUserDictまたはDictMixinに置き換えることができます。(しかし、私はこの種の変更を自分で行ったことがなく、DjangoがModelAdminオブジェクトのコレクションをどのように反復するかについて知識に基づいた推測をしているだけなので、このアドバイスを一粒の塩で受けてください。django/ contribただし、/ admin / sites.pyはこのコードを探す場所であり、特にAdminSiteクラスとregister()およびindex()メソッドが必要です。)

明らかに、ここで最も優れているのは、独自の/admin.pyモジュールで指定するための単純なオプションです。それはあなたが受け取りたいと思っていた種類の答えだと確信しています。ただし、これらのオプションが存在するかどうかはわかりません。

于 2008-12-29T18:17:19.880 に答える
0

私の解決策は、django.contrib.admin.sites.AdminSiteとdjango.contrib.admin.options.ModelAdminのサブクラスを作成することでした。

これを行ったのは、各アプリのよりわかりやすいタイトルを表示し、各アプリのモデルの外観を注文できるようにするためです。そのため、settings.pyに、app_labelsをわかりやすい名前とそれらが表示される順序にマップする辞書があります。モデルは、管理サイトに登録するときに各ModelAdminで指定する順序フィールドで並べ替えられます。

AdminSiteとModelAdminの独自のサブクラスを作成することはドキュメントで推奨されていますが、私のソリューションは最終的には醜いハックのように見えます。

于 2009-07-16T23:48:17.580 に答える
0

lib\site-packages\django\contrib\admin\templates\admin\index.htmlテンプレートをproject1\templates\admin\ディレクトリにコピーしproject1ます。ここで、 はプロジェクトの名前です。

コピーしたファイルで、つまりproject1\templates\admin\index.html次の行を置き換えます。

{% block content %} 
...
{% endblock %}

と:

{% block content %}
<div id="content-main">

{% if app_list %}
    <div class="module">
        <table>
            <caption>App 1</caption>
            <tr>  <th>  <a href="/admin/app1/model1/">Model 1</a>  </th>  <td>Description of model 1</td>  </tr>
            <tr>  <th>  <a href="/admin/app1/model2/">Model 2</a>  </th>  <td>Description of model 1</td>  </tr>
            <tr>  <th>  <a href="..."                >...</a>      </th>  <td>...</td>                     </tr>
        </table>
    </div>

    <div class="module">
        <table>
            <caption>Authentication and authorization</caption>
            <tr>  <th>  <a href="/admin/auth/user/"  >Users</a>    </th>  <td>List of users</td>           </tr>
            <tr>  <th>  <a href="/admin/auth/group/" >Groups</a>   </th>  <td>List of users' groups</td>   </tr>
        </table>
    </div>
{% else %}
    <p>{% trans "You don't have permission to view or edit anything." %}</p>
{% endif %}

</div>
{% endblock %}  

どこ:

  • app1 モデルを含むアプリケーションの名前です。
  • modeli の i 番目のモデルの名前ですapp1

プロジェクトでモデルを使用して複数のアプリケーションを定義した場合は、上記のindex.htmlファイルに別のテーブルを追加するだけです。

テンプレートを変更するので、その HTML コードを自由に変更できます。たとえば、上記のようにモデルの説明を追加できます。追加リンクと変更リンクを元に戻すこともできます - 冗長だと思うので削除しました。

答えは、 Dave Kasper's answerからのソリューションの実用的なデモンストレーションです。

于 2019-07-11T12:17:49.823 に答える