Evgenii Legotckoi
Evgenii Legotckoi10. Februar 2022 04:13

Django – Lektion 057. Mehrsprachige Unterstützung in MarkdownField mit automatischer Füllfunktion

Der Artikel So schreiben Sie die Funktion zum automatischen Auffüllen von Feldern beschrieb die einfachste Funktionalität des MarkdownField-Felds zur Unterstützung der Markdown-Syntax auf einer Website mit automatischer Generierung von HTML-Inhalten.

Ich habe nicht sofort erweiterte Funktionen gezeigt, damit es einfacher wäre zu verstehen, wie ein Feld wie Markdown ist. Aber jetzt möchte ich diese Funktionalität erweitern, um Unterstützung für Mehrsprachigkeit hinzuzufügen.


Angabe der Aufgabe

Um Mehrsprachigkeit in Django-Sites hinzuzufügen, verwenden sie normalerweise die vorgefertigte Django-Modellübersetzungsbatterie, daher werde ich auch Unterstützung für diese Batterie in diesem Bereich verwenden.

Implementierung

Um dies zu implementieren, müssen Sie in den Site-Einstellungen (Datei settings.py) das Vorhandensein der verbundenen Anwendung modeltranslation überprüfen und dann den HTML-Inhalt im entsprechenden Feld mit der ausgewählten Sprache generieren.

Um die Unterstützung für diese Funktionalität richtig zu implementieren, ändern wir die set_html -Methode aus dem Artikel Wie man eine Funktion zum automatischen Auffüllen von Feldern schreibt .

# -*- coding: utf-8 -*-

from django.conf import settings
from django.db import models
from django.db.models.signals import pre_save

from .utils import MarkdownWorker


class MarkdownField(models.TextField):
    """
    This field save markdown text with auto-populate text to html field.
    This field must be used with second text field for html content.
    This field support django-modeltranslation package.
    """

    def set_html(self, instance=None, update_fields=None, **kwargs):
        value = getattr(instance, self.attname)
        if value and len(value) > 0:
            languages = getattr(settings, "LANGUAGES", None)
            if 'modeltranslation' in settings.INSTALLED_APPS and self.name.endswith(tuple([code for code, language in languages])):
                instance.__dict__['{}_{}'.format(self.html_field, self.name[-2:])] = MarkdownWorker(value).get_text()
            else:
                instance.__dict__[self.html_field] = MarkdownWorker(value).get_text()

    # Program code from previoues article

Wenn die Methode set_html aufgerufen wird, prüfen wir, ob die App modeltranslation in den Einstellungen der Website vorhanden ist und ob der Markdown-Name des Felds in einer der auf der Website registrierten Sprachen endet.
Wenn die Bedingung erfüllt ist, setzen wir den generierten HTML-Inhalt auf das HTML-Feld mit dem Sprachcode, mit dem der MarkdownField-Name endet. Andernfalls setzen wir den Inhalt auf ein reguläres html_field.

Warum funktioniert das?

Wenn Sie Modellübersetzung noch nicht kennen, dann werde ich kurz das Funktionsprinzip dieses Akkus beschreiben, ohne einen detaillierten Prozess zur Verwendung dieses Akkus. Weil mir die offizielle Dokumentation erschöpfend erscheint.

Bei der Registrierung eines Felds als mehrsprachig mit modeltranslation werden zusätzliche Felder in der Modelltabelle mit dem Code aller Sprachen erstellt, die auf der Website in der LANGUAGES-Variablen registriert sind.

Das heißt, wenn dem Datenmodell das übliche content -Feld und das content_markdown -Markdown-Feld hinzugefügt werden, werden mit Unterstützung der russischen und englischen Sprache die folgenden Felder hinzugefügt:

  • content_ru
  • content_de
  • content_markdown_ru
  • content_markdown_en

Wenn also ein MarkdownField content_markdown_en heißt, nimmt es den Wert von html_field , der gleich content ist, und fügt den Sprachcode von content_markdown_en hinzu, um content_en zu erhalten.

Dies bietet mehrsprachige Unterstützung für MarkdownField .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Lissa
  • 19. April 2023 07:57

Большое спасибо. Очень много интересного и полезного.
p.s. Маленькая опечатка в слове "мультиязычности" (4 строка)

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken