Evgenii Legotckoi
Evgenii Legotckoi19. März 2023 10:56

Django - Tutorial 061. Hinzufügen einer Anzahl eindeutiger Ansichten

Ganz am Anfang der Erstellung von Artikeln und Fragen im Forum habe ich einen einfachen Zähler für Ansichten zu diesem Inhalt hinzugefügt.
Dieser Zähler war ein gewöhnliches Feld vom Integer-Typ und wurde jedes Mal, wenn eine Seite angefordert wurde, um eins erhöht.
Aber vor nicht allzu langer Zeit habe ich diesen Zähler durch ein Zählermodell zum Registrieren eindeutiger Ansichten ersetzt. Ich habe es nur gemacht, weil ich es schöner finde.

Der Zähler zählt eindeutige Besucher entweder nach IP-Adresse, wenn der Benutzer auf der Website nicht autorisiert ist, oder nach Benutzerkonto, wenn dieser Benutzer auf der Website autorisiert ist.

Also lass uns lernen, wie es geht.

Viewer-Modell

Verantwortlich für das Zählen einzelner Benutzer, die die Website angesehen haben.

class Viewer(models.Model):
    ipaddress = models.GenericIPAddressField("IP address", blank=True, null=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, blank=True, null=True)

Wie Sie sehen können, gibt es in diesem Modell nur zwei Felder, das erste ist die IP-Adresse und das zweite der Fremdschlüssel für das Benutzermodell

Hinzufügen eines Zählers zum Inhaltsmodell

Und jetzt fügen wir einem Site-Content-Modell einen Zähler hinzu, zum Beispiel dem Artikelmodell Artikel

class Article(models.Model):
    viewers = models.ManyToManyField(Viewer)

    # Some another code

Das Hinzufügen von Code erfolgt als Viele-zu-Viele-Beziehung. Da der eindeutige Besucher in diesem Fall einer sein wird, kann er jedoch viele andere Artikel anzeigen. Gleichzeitig kann der Artikel von vielen anderen Nutzern eingesehen werden.

So erhöhen Sie den Inhaltsansichtszähler

Höchstwahrscheinlich ist eine Ansichtsklasse oder Ansichtsfunktion für die Anzeige von Artikeln auf Ihrer Website verantwortlich. Ich persönlich bevorzuge die moderne klassenbasierte Ansicht in Django.

Daher werde ich ein Mixin schreiben, das mit DetailView verwendet werden kann, um eindeutige Ansichten von Inhalten auf der Website zu registrieren.

class CountViewerMixin:

    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)
        if hasattr(self.object, 'viewers'):
            viewer, created = Viewer.objects.get_or_create(
                ipaddress=None if request.user.is_authenticated else get_client_ip(request),
                user=request.user if request.user.is_authenticated else None
            )

            if self.object.viewers.filter(id=viewer.id).count() == 0:
                self.object.viewers.add(viewer)

        return response

Aus dem Code ist ersichtlich, dass das Mixin die get-Methode überschreibt, überprüft, ob das Inhaltsobjekt in der Ansicht existiert und erst danach einen eindeutigen Besucher erhält, und nachdem überprüft wurde, dass der Besucher noch nicht unter den Besuchern vorhanden ist, die die angesehen haben Inhalt, fügt ihn den Inhaltsansichten hinzu.

Das Inhaltsobjekt selbst wird also nicht modifiziert, im Gegensatz zum Zähler in Form eines Integer-Felds im Inhaltsmodell. Was den Code tatsächlich verkomplizieren kann, ist, wenn Sie Methoden zum Speichern von Inhaltsmodellen überschreiben oder Empfänger -Funktionen geschrieben haben, um Sicherungssignale vom Modell zu verarbeiten. Beim Viewer -Zähler, der in diesem Artikel vorgestellt wird, funktionieren Signale wie post_save auf dem Inhaltsmodell einfach nicht.

In der Inhaltsansicht sieht die Mixin-Verbindung folgendermaßen aus:

class ArticleView(CountViewerMixin, DetailView):
    # some another code

Verwendung in Vorlage

Innerhalb der Vorlage können Sie die Anzahl der Ansichten wie folgt abrufen

{{ object.viewers.count }}

get_client_ip

Das Mixin hat auch eine Funktion, um eine IP-Adresse von einer HTTP-Anfrage zu erhalten. Ich habe diese spezielle Funktion zum [Abrufen der IP-Adresse des Benutzers aus einer Anfrage in einem der Artikel] bereits beschrieben (https://evileg.com/ru/post/181/).

Und in meiner neuesten Überarbeitung für Django 3 sieht es so aus.

def get_client_ip(request):
    """
    Get client ip address from HTTP request

    :param request: HTTP request
    :return: IP Address
    """
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    return x_forwarded_for.split(',')[-1].strip() if x_forwarded_for else request.META.get('REMOTE_ADDR')

Abschluss

Ein solcher Zähler erleichtert die Wartung des Codes, wenn Sie Reaktionen auf das Speichern von Inhalten haben, und verringert auch die Auswirkungen von Cheats auf Inhaltszähler.

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

Magst du es? In sozialen Netzwerken teilen!

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