Создать теги шаблона из текущей функции

Я формально построил функцию в моем models.py файле:

from datetime import datetime
from django.template.defaultfilters import date as datefilter
from django.utils import translation

def date_customerprofile(language):
    now_ = datetime.today()
    if language == 'English':
        translation.activate('en')
        return datefilter(now_, 'l, F j, Y')
    else:
        translation.activate('fr')
        return datefilter(now_, 'l, j F Y')

Я знаю, что язык шаблонов Django НЕ Python, поэтому мы не можем написать {{ customer.date_customerprofile('French') }}.

Решение здесь состоит в том, чтобы создать собственный тег шаблона. Также обратите внимание, что translation.activate изменит активный язык для оставшейся части цикла запроса/ответа — использование диспетчера контекста translation.override, безусловно, является лучшей идеей. Поскольку я не эксперт по тегам шаблонов, может ли кто-нибудь показать мне, как я могу создать его с учетом вышеуказанной функции?

Я думаю, что мы могли бы использовать следующий вопрос, чтобы сделать такую ​​​​вещь Как форматировать дату в разных языки?

Могу ли я использовать менеджер контекста: Переключение Django, для блока кода, переключить язык, чтобы переводы выполнялись на одном языке?

Спасибо!

На самом деле, я хотел бы вернуть в шаблоне текущую дату на французском языке «Jeudi, 30 mars 2017» или текущую дату на английском языке Thursday, March 30, 2017.

P.S. Пожалуйста, сообщите мне, если вопрос не ясен.

Это пример шаблона Джанго:

{% load i18n %}
{% load date %}

{{ customer.civil_title }}{{ user.get_full_name }}                                         
{{ customer.civic_number }}, {{ customer.street }}
{{ customer.rough_location }}

{# customer. date_customerprofile('English') #}


                           7 DAYS NOTICE

Subject:  Overdue account with ...
Client id : {{ customer.id }}

Hello {{ customer.civil_title }}{{ user.get_full_name }},

This notice serves to inform you that your payments with Gestion Multi Finance Inc. are pending. Your file has been transferred to our collection service. The balance of your loan is now:  {{ customer.current_balance }}.

We are asking you to communicate with us without delay, by phone at: 1-855-... ext. 324 or by email at: ... to find a payment solution in order to regulate your situation. If this does not happen, we will be forced to send you a notice of acceleration of the process and transfer your file to our judiciary collection service, with authority to take the necessary steps in the collection process. These steps can include the seizure of salary, but we prefer to avoid these measures.

 Also, it is important to remember that at the time of the loan, you signed a contract in which you agreed to respect the payments. Unfortunately, you have no respected this agreement.

 Ignore this notice if an agreement has already been reached.

Cordially,

{{ email.footer.txt }}

person Community    schedule 30.03.2017    source источник


Ответы (1)


Теперь, когда мы увидели совершенно бессмысленный ответ, вот серьезный:

В вашем модуле yourapp/templatetags/yourapptags.py:

from django import template
register = template.Library()

DATE_FORMATS = {
    "en":  "l, F j, Y",
    "fr": "l, j F Y"
}

DEFAULT_LANG = 'fr'

@register.simple_tag
def localdate(lang=DEFAULT_LANG):
    fmt = DATE_FORMATS.get(lang, DATE_FORMATS[DEFAULT_LANG])
    now = datetime.now()
    with translation.override(lang):
        return datefilter(now, fmt)

Затем в вашем шаблоне:

{% load "yourapptags" %}

<p>EN : {% localdate 'en' %}</p>
<p>FR : {% localdate 'fr' %}</p>

Обратите внимание, что это для принудительного форматирования/локализации даты в данной локали, какой бы ни была текущая локаль, что в данном случае кажется мне довольно странным.

Если вы действительно хотите просто отобразить текущую дату, отформатированную в соответствии с языковым стандартом текущего посетителя (см. -discovers-language-preference" rel="nofollow noreferrer">https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#how-django-discovers-language-preference), вы можете просто избавиться от аргумента lang и использовать вместо него translation.get_language():

@register.simple_tag
def localdate():
    lang = translation.get_language()
    fmt = DATE_FORMATS.get(lang, DATE_FORMATS[DEFAULT_LANG])
    now = datetime.now()
    return datefilter(now, fmt)

Также обратите внимание, что файлы форматов l10n, предоставляемые Django, уже имеют определены некоторые форматы даты, и вы можете их переопределить.

person bruno desthuilliers    schedule 31.03.2017
comment
Я использую тег шаблона в шаблоне Django, поэтому это письмо<p>EN : {% localdate 'en' %}</p> не очень хорошо принято. Даже если ваш ответ, вероятно, лучше, потому что он довольно короткий и компактный, я должен использовать это письмо {{ customer|tmpl_date_customerprofile:'French' }}. Что вы предлагаете? - person ; 31.03.2017
comment
{{ customer|tmpl_date_customerprofile:'French' }} — это не тег шаблона, а переменная шаблона с примененным к ней фильтром. И я не вижу никаких причин, по которым вы должны использовать один синтаксис вместо другого - но вы не предоставили никакой предыстории своего вопроса, не так ли? - person bruno desthuilliers; 31.03.2017
comment
Если вы хорошо понимаете, шаблон Django немного отличается от шаблона html. Я добавлю картинку в свой вопрос через две минуты - person ; 31.03.2017
comment
На самом деле, есть часть в html и другая часть в не-html... странно! - person ; 31.03.2017
comment
Шаблоны Django на самом деле не имеют ничего общего с html — они генерируют любой текстовый формат, который вы хотите. Ваш шаблон, очевидно, используется для электронных писем, поэтому использование html и чистой текстовой версий довольно распространено. - person bruno desthuilliers; 31.03.2017
comment
Как я мог использовать <p>EN : {% localdate 'en' %}</p> в «тестовом формате», чтобы он подходил. Это написание {{ En : localdate 'en' }} или EN : {% localdate 'en' может работать хорошо? - person ; 31.03.2017
comment
Эээ... Учитывая пример шаблона, очевидно, что это оплачиваемая работа. Если вы даже не в состоянии ответить на этот последний вопрос, то вы, очевидно, делаете не ту работу - и я не собираюсь на вашу работу бесплатно, извините. - person bruno desthuilliers; 31.03.2017
comment
Не могли бы вы хотя бы сказать мне, почему у меня есть ValueError: Invalid arguments provided to simple_tag - person ; 31.03.2017
comment
Ошибка в моем коде, извините - исправил в ответе. - person bruno desthuilliers; 31.03.2017
comment
name='localdate', и это переопределение, а не активация. В остальном работает хорошо - person ; 31.03.2017
comment
Да, я не должен отвечать здесь, ожидая запуска полного набора тестов;) - person bruno desthuilliers; 31.03.2017