gpt4 book ai didi

django - 如何让 Django 管理员尊重波兰语等语言的语法情况?

转载 作者:行者123 更新时间:2023-12-01 19:13:54 25 4
gpt4 key购买 nike

Django 允许覆盖 Modelverbose_nameverbose_name_plural,这允许我们指定 Model 的正确复数形式> 非英语语言的名称(例如,KandydaciKandydat 的复数形式,而不是默认的 Kandydats,后者在波兰语中看起来很奇怪)。

但是,这对于具有语法案例的语言来说还远远不够。例如,Django Admin 兴高采烈地向我们展示了这样的内容:

enter image description here

(其中Zaznacz kandydat do zmiany代表选择要更改的kandydat - Kandydat模型的名称)

这是不正确的。在这句话中,型号名称应该显示在accusative case中。 ,这是kandydata。但是,我不能简单地指定此 Modelverbose_nameKandydata,因为也会影响 nominative case 的所有位置。是预期的 - 到目前为止我已经找到了一个这样的地方,这是表格列的标题:

enter image description here

这是不正确的,因为表格标题应该称为 Kandydat 而不是 Kandydata

如何解决这个问题?

最佳答案

字符串'Select <verbose_name> to change'admin's main view 内声明

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

作为 {{ title }} 模板变量

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

因此,触摸内置 View 是毫无问题的。但还有另一种方法可以做到这一点!你看,Django 管理模板充满了 {% block %} s 充当占位符以覆盖它们。阅读有关 overriding Admin templates 的官方文档了解更多信息.

那么,回答你的问题。

  1. 在项目的根目录下创建一个目录 templates (如果它尚不存在)。
  2. my_project/templates/创建另一个,admin .
  3. my_project/templates/admin/创建文件change_list.html .
  4. 里面my_project/templates/admin/change_list.html把这些:

    {% 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. 在您的 myutils/templatetags/myutils_filters.py 内文件放置这些:

    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 makemessages , manage.py compilemessages ,重新加载浏览器,瞧!

注意:上面的内容可能看起来有点黑客,但效果很好。在本地测试并有效。

关于django - 如何让 Django 管理员尊重波兰语等语言的语法情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45466076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com