2017-08-02 4 views
2

Djangoは、私たちは(Kandydatの複数の代わりに、ポーランドに奇妙に見えるデフォルトKandydats例としてKandydaci用)英語以外の言語のためのModel名の正しい複数形を指定することを可能にする、Modelverbose_nameverbose_name_pluralを上書きすることができます。Djangoの管理者がポーランド語のような言語で文法的なケースを尊重する方法を教えてください。

ただし、これは文法上の問題がある言語では十分ではありません。

これは間違っている - (KandydatModelの名前ですSelect kandydat to changeためZaznacz kandydat do zmianyスタンドは)

enter image description here

は:例えば、Djangoの管理者は大喜びで私たちのようなものが表示されます。この文章では、モデル名はaccusative caseに表示されているはずです(kandydata)。しかし、私は単にもnominative caseが代わりに期待されているすべての場所に影響を与えるので、このModelverbose_nameは、Kandydataであることを指定することはできません - 私はこれまでのところそのような場所を見つけた、とこれは、テーブルの列の見出しです:

enter image description here

KandydatではなくKandydataと表記する必要があります。

これを修正するにはどうすればよいですか?

+0

注:アプリケーションに必要な言語は1つだけです。ポーランド語です。 – gaazkam

+0

以下の回答はあなたの質問に役立ったか? –

+0

@nik_m私はすぐにそれをチェックします。今のところ、プロジェクトの別の部分に移動しなければならず、ちょっと後で管理者の仕事を残す必要があります。しかし、数日後に私は管理者に確実に戻ってきます。そして私はあなたの答えをチェックします。私は本当に感謝しています。遅れて申し訳ありませんが、私はちょうどする必要があります。 – gaazkam

答えて

1

ストリング'Select <verbose_name> to change'{{ title }}テンプレート変数

{% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}

として admin's main view

self.title = title % force_text(self.opts.verbose_name)

内で宣言されています

したがって、組み込みビューに触れることは問題になりません。しかし、それを行う別の方法があります! Django Adminテンプレートは、プレースホルダとして機能し、オーバーライドするために{% block %}でいっぱいです。 overriding Admin templatesの公式ドキュメントをご覧ください。

あなたの質問にお答えください。

  1. プロジェクトのルートディレクトリの下にディレクトリtemplates(まだ存在しない場合)を作成します。
  2. my_project/templates/の下にもう1つ、adminを作成します。
  3. my_project/templates/admin/の下にファイルchange_list.htmlを作成します。my_project/templates/admin/change_list.htmlインサイド
  4. は、これらの置く:あなたのmyutils/templatetags/myutils_filters.pyファイルの中

    {% extends 'admin/change_list.html' %} 
    
    {% load myutils_filters %} 
    
    {% comment %} 
    You have to create an app that will hold all common tags/filters 
    that are re-usable across your entire project. 
    The model class itself is passed as cl.model 
    {% endcomment %} 
    
    {% block content_title %}{{ block.super|to_accusative:cl.model }}{% endblock %} 
    
  5. をこれらを置く:

    from django import template 
    from django.utils.html import format_html 
    from django.utils.encoding import force_text 
    
    register = template.Library() 
    
    @register.filter() 
    def to_accusative(value, model): 
        verbose_name = model._meta.verbose_name # declared in Meta 
        new_name = force_text(model.accusative case()) # a custom class method (lives in your Model) 
        return format_html(value.replace(verbose_name, new_name)) 
    
  6. 最後に、あなたのアプリのmodels.pyの下で、各モデルの下でclassこのようclassmethodメソッドを定義します。

    from django.db import models 
    from django.utils.translation import ugettext_lazy as _ 
    
    class MyModel(models.Model): 
        # model fields here 
    
        def __str__(): 
         return self.a_field 
    
        class Meta: 
         verbose_name = 'verbose name' 
         verbose_name_plural = 'verbose name plural' 
         # accusative_case = 'accusative name case' # BAD. Raises error. Implement a class method intead ;) 
    
        @classmethod 
        def accusative_case(cls): 
         # You'll define the Polish translation as soon as you run makemessages 
         return _('Name in english of the accusative case') 
    
  7. 実行manage.py makemessagesmanage.py compilemessages、ブラウザをリロードしてください。

注:上記ハック少し見えますが、それは素晴らしい作品があります。ローカルでテストされ、動作します。

関連する問題