Evgenii Legotckoi
Evgenii LegotckoiҚар. 22, 2019, 2:03 Т.Ж.

Django - Оқулық 050. SingletonModel көмегімен сайттың динамикалық параметрлерін жасау

Пайдаланушыға қолжетімді болатын қандай да бір динамикалық торап параметрлері болуы қажет Django негізіндегі CMS бар сайтты жасап жатырсыз делік. Мысалы, көптілділік мүмкіндігін ескере отырып, сайттың атауы, кейбір арнайы ақпарат. Сонда бұл үшін не қолдануға болады? Менде мәліметтер базасын пайдалану идеясы болды.

Оны жүзеге асыру үшін мыналар қажет:

  1. Әрқашан тек бір нысанды, яғни бір ғана жазбаны қамтитын деректер моделін құру. Яғни, бұл Singleton моделі болады.
  2. Django әкімшісінде осы жазбаны жоюға және жаңаларын жасауға жол бермеңіз
  3. Торап параметрлерін қарау функциясына жүктемей-ақ, осы үлгідегі ақпаратты тікелей үлгіде пайдалану мүмкіндігі.

Мұны қалай жүзеге асыруға болатынын қарастырайық.


Бірыңғай модель

Мен GitHub сайтында 2012 жылы жазылған дерексіз SingletonModel кодын таптым. Міне мағынасына сілтеме .

Міне осы SingletonModel коды

class SingletonModel(models.Model):
    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        self.__class__.objects.exclude(id=self.id).delete()
        super(SingletonModel, self).save(*args, **kwargs)

    @classmethod
    def load(cls):
        try:
            return cls.objects.get()
        except cls.DoesNotExist:
            return cls()

сақтау әдісіндегі модель нысанды сақтау кезінде барлық қалғандарын автоматты түрде сақтайды, бұл әрқашан дерекқорда осы үлгінің тек бір данасын сақтауға мүмкіндік береді.

load әдісі дерекқордан жалғыз параметрлер нысанын алады, егер дерекқорда нысан жоқ болса, ол осы үлгінің жаңа данасын қайтарады, содан кейін оны сақтау қажет болады.

Келешекте қажеттіліктеріміз үшін пайдалану үшін өз параметрлер сыныбын жасайық.

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

from django.db import models
from django.utils.translation import ugettext_lazy as _

from my_app.singleton_model import SingletonModel


class SiteSettings(SingletonModel):
    site_url = models.URLField(verbose_name=_('Website url'), max_length=256)
    title = models.CharField(verbose_name=_('Title'), max_length=256)

    def __str__(self):
        return 'Configuration'

Әкімші панельдерін орнату

Енді Django әкімшісінде осы жазбаны жоюды және жаңаларын жасауды өшіру керек.

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

from django.contrib import admin
from django.db.utils import ProgrammingError

from my_app.models import SiteSettings


class SiteSettingsAdmin(admin.ModelAdmin):
    # Create a default object on the first page of SiteSettingsAdmin with a list of settings
    def __init__(self, model, admin_site):
        super().__init__(model, admin_site)
        # be sure to wrap the loading and saving SiteSettings in a try catch,
        # so that you can create database migrations
        try:
            SiteSettings.load().save()
        except ProgrammingError:
            pass

    # prohibit adding new settings
    def has_add_permission(self, request, obj=None):
        return False

    # as well as deleting existing
    def has_delete_permission(self, request, obj=None):
        return False


admin.site.register(SiteSettings, SiteSettingsAdmin)

Параметрлерді енді Python кодында пайдалануға болады.

Үлгіге параметрлерді жүктеу үшін контекстік процессорды жасаңыз

context_proccessors.py

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

from evileg_settings.models import SiteSettings


def load_settings(request):
    return {'site_settings': SiteSettings.load()}

settings.py

Содан кейін біз load_settings қосамыз

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Загружаем наши настройки при каждом рендеринге шаблона с контекстом
                'my_app.context_processors.load_settings', 
            ],
        },
    },
]

Үлгіде пайдалану

<h1>{{ site_settings.title }}</h1>

Қорытынды

Осылайша сіз Django-да қарапайым динамикалық сайт параметрлерін тез және оңай енгізе аласыз, содан кейін оларды бізді қызықтыратын барлық сайт параметрлеріне байланыстыра аласыз.
Бұл тәсілдің артықшылығы сайттағы кейбір арнайы деректер үшін сыртқы кілттерді пайдалану мүмкіндігі, сондай-ақ джанго моделін аударуды пайдалану болады, яғни көптілділікпен ешқандай проблемалар болмайды.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
m
moogoҚар. 22, 2024, 7:17 Т.Ж.
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Бізді әлеуметтік желілерде бақылаңыз