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