Поради як безпечно налаштувати сервер на продакшені
приховати SECRET_KEY
Можемо читати з .env, а можемо з окремого файлу (а також перед кожним запуском формувати новий)
Якщо працює – залиш це тут!
Можемо читати з .env, а можемо з окремого файлу (а також перед кожним запуском формувати новий)
Приклади коду шаблону, щоб не забути, (css – bootstrap 5)
Черга
Подивитись повідомлення, що стоять в черзі на відправку:
 exim -bp
порахувати скільки разів зустрічається слово
grep -o -i user@example.com /var/log/exim4/mainlog | wc -l
Зустрів таку позначку
class Meta: # noqa
Виявилось, що це не просто комент. Відключає попередження IDE:
NOQA stands for NO Quality Assurance. What this typically means is that if you have any warning in your IDE, then if you add a comment as # noqa at the end of the line then the warning will be ignored by the IDE.
Ще документація
Зберіг тут швидкий старт по Docker
для Django – декілька команд швидкого запуску в Docker:
docker –version
sudo docker build -t <project_name> .
docker container ls
docker run -it -p 8000:8080 –name <project_name>
sudo docker exec -it <container_id> /bin/bash
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic
Ця тема добре розкрита в документації
Додати щось важко, важливо бути уважним. Тут будуть особливості.
Після налаштувань згідно з інструкцією автоматично обирає локаль в залежності від налаштувань браузера відвідувача.
Два варіанти перемикача (ставив в базовий шаблон)
перший – вказано тільки інші мови
{% if page %}
    {% for translation in page.get_translations.live %}
        {% get_language_info for translation.locale.language_code as lang %}
        <a href="{% pageurl translation %}" rel="alternate" hreflang="{{ language_code }}">
            {{ lang.name_local }}
        </a>
    {% endfor %}
{% endif %}Другий – є усі локалі, налаштовані в settings/base.py
{% for language_code, language_name in LANGUAGES %}
    {% get_language_info for language_code as lang %}
    {% language language_code %}
        <a href="{% pageurl page.localized %}" rel="alternate" hreflang="{{ language_code }}">
            {{ lang.name_local }}
        </a>
    {% endlanguage %}
{% endfor %}
{% load i18n %}
 {% get_current_language as LANGUAGE_CODE %}
 <html class=”no-js” lang=”{{ LANGUAGE_CODE }}”>
Розгортаємо (наприклад версія Python 3.9, тут для Windows):
python3.9 -m venv env
 source env/bin/activate
 python -m pip install –upgrade pip
 pip install django АБО pip install git+https://github.com/django/django.git # (альтернатива встановлення з GIT )
 pip install -r requirements.txt  # (якщо цей файл є )
 python manage.py makemigrations
 python manage.py migrate
 python manage.py createsuperuser
 python manage.py createsuperuser --email admin@example.com --username admin
 python manage.py runserver '0.0.0.0:8000'
PS:різновид встановлення Django з GIT дозволяє встановити будь-який допрацьований проєкт (не обов’язково базований на Django, але тут про нього)
import secrets
 print(secrets.token_hex(32))
для завантаження з файлу:
pip install python-dotenv
контент .env файлу
SECRET_KEY=your_secret_key_here
фрагмент коду:
import os
 from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.getenv('SECRET_KEY')
Для того, щоб не розповсюджувати секретну інформацію (наприклад на github) треба додати до виключень файл “.env” у “.gitignore”.
Розгортаємо:
 python3.9 -m venv env
 pip install wagtail
 wagtail start mysite .
 pip install -r requirements.txt
 python manage.py makemigrations
 python manage.py migrate
 python manage.py createsuperuser
все схоже як у Django
pagination
не оптимально, але для старту ок
 https://learnwagtail.com/tutorials/how-to-paginate-your-wagtail-pages/
Для Foreign – поля обов’язково використовувати on_delete=models.опція є такі ключі:
CASCADE: When the referenced object is deleted, also delete the objects that have references to it (when you remove a blog post for instance, you might want to delete comments as well). SQL equivalent: CASCADE.
 PROTECT: Forbid the deletion of the referenced object. To delete it you will have to delete all objects that reference it manually. SQL equivalent: RESTRICT.
 RESTRICT: (introduced in Django 3.1) Similar behavior as PROTECT that matches SQL’s RESTRICT more accurately. (See django documentation example)
 SET_NULL: Set the reference to NULL (requires the field to be nullable). For instance, when you delete a User, you might want to keep the comments he posted on blog posts, but say it was posted by an anonymous (or deleted) user. SQL equivalent: SET NULL.
 SET_DEFAULT: Set the default value. SQL equivalent: SET DEFAULT.
 SET(…): Set a given value. This one is not part of the SQL standard and is entirely handled by Django.
 DO_NOTHING: Probably a very bad idea since this would create integrity issues in your database (referencing an object that actually doesn’t exist). SQL equivalent: NO ACTION. (2)