Разное

Admin site register django: Writing your first Django app, part 2 | Django documentation

Содержание

Интерфейс администратора Django — Документация Django 3.0

list_display указывает какие поля отображать на странице списка объектов.

If you don’t set list_display, the admin site will display a single
column that displays the __str__() representation of each object.

  • If the field is a ForeignKey, Django will display the
    __str__() of the related object.

  • ManyToManyField не поддерживается, так как это влечет к созданию SQL запроса для каждого объекта. Если вам необходимо сделать это в любом случае, создайте метод модели и используйте его в list_display. (Смотрите ниже подробности про использование методов в list_display.)

  • If the field is a BooleanField, Django will display a pretty «on» or
    «off» icon instead of True or False.

  • Если используется метод модели, ModelAdmin или функция, Django по умолчанию экранирует результат. Если вам нужно экранировать данные, вводимые пользователем, и не экранировать собственные теги, используйте format_html().

    Пример:

    from django.contrib import admin
    from django.db import models
    from django.utils.html import format_html
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        color_code = models.CharField(max_length=6)
    
        def colored_name(self):
            return format_html(
                '<span>{} {}</span>',
                self.color_code,
                self.first_name,
                self.last_name,
            )
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('first_name', 'last_name', 'colored_name')
    
  • As some examples have already demonstrated, when using a callable, a
    model method, or a ModelAdmin method, you can customize the column’s
    title by adding a short_description attribute to the callable.

  • Если значение поля None, пустая строка, или пустой итератор, Django покажет - (дефис). Вы можете переопределить это значение с помощью параметра AdminSite.empty_value_display:

    from django.contrib import admin
    
    admin.site.empty_value_display = '(None)'
    

    You can also use ModelAdmin.empty_value_display:

    class PersonAdmin(admin.ModelAdmin):
        empty_value_display = 'unknown'
    

    Или для поля:

    class PersonAdmin(admin.ModelAdmin):
        list_display = ('name', 'birth_date_view')
    
        def birth_date_view(self, obj):
             return obj.birth_date
    
        birth_date_view.empty_value_display = 'unknown'
    
  • Если используется метод модели, ModelAdmin или функция, которая возвращает True или False, Django покажет «on» или «off» иконки, если вы добавите атрибут boolean методу или функции со значением True.

    Пример:

    from django.contrib import admin
    from django.db import models
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        birthday = models. DateField()
    
        def born_in_fifties(self):
            return self.birthday.strftime('%Y')[:3] == '195'
        born_in_fifties.boolean = True
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('name', 'born_in_fifties')
    
  • The __str__() method is just as valid in list_display as any
    other model method, so it’s perfectly OK to do this:

    list_display = ('__str__', 'some_other_field')
    
  • Обычно элементы list_display, которые не являются полями модели, не могу быть использованы при сортировке (так как Django выполняет сортировку на уровне базы данных).

    Однако, если элемент list_display представляет определенное поле в базе данных, вы можете указать это добавив атрибут admin_order_field к элементу.

    Например:

    from django.contrib import admin
    from django.db import models
    from django.utils.html import format_html
    
    class Person(models.Model):
        first_name = models. CharField(max_length=50)
        color_code = models.CharField(max_length=6)
    
        def colored_first_name(self):
            return format_html(
                '<span>{}</span>',
                self.color_code,
                self.first_name,
            )
    
        colored_first_name.admin_order_field = 'first_name'
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('first_name', 'colored_first_name')
    

    В этом примере Django будет использовать поле first_name при сортировке по colored_first_name.

    Для обратной сортировки в admin_model_field можно использовать префикс -. Например:

    colored_first_name.admin_order_field = '-first_name'
    

    admin_order_field позволяет добавить сортировку по значению из связанных моделей. Этот пример содержит колонку «имя автора» и позволяет выполнить сортировку по ней:

    class Blog(models.Model):
        title = models.CharField(max_length=255)
        author = models.ForeignKey(Person, on_delete=models. CASCADE)
    
    class BlogAdmin(admin.ModelAdmin):
        list_display = ('title', 'author', 'author_first_name')
    
        def author_first_name(self, obj):
            return obj.author.first_name
    
        author_first_name.admin_order_field = 'author__first_name'
    

    Query expressions may be used in
    admin_order_field. For example:

    from django.db.models import Value
    from django.db.models.functions import Concat
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
    
        def full_name(self):
            return self.first_name + ' ' + self.last_name
        full_name.admin_order_field = Concat('first_name', Value(' '), 'last_name')
    
  • Elements of list_display can also be properties. Please note however,
    that due to the way properties work in Python, setting
    short_description or admin_order_field on a property is only
    possible when using the property() function and not with the
    @property decorator.

    Например:

    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
    
        def my_property(self):
            return self.first_name + ' ' + self.last_name
        my_property.short_description = "Full name of the person"
        my_property.admin_order_field = 'last_name'
    
        full_name = property(my_property)
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('full_name',)
    
  • Названия полей из list_display будут использованы в CSS классах, форма будет содержать класс column-<field_name> для каждого элемента <th>. Так можно определить ширину полей через CSS стили.

  • Django попытается интерпретировать каждый элемент list_display в следующем порядке:

    • Поле модели.
    • Метод или любой другой вызываемый объект.
    • Строка, представляющая атрибут ModelAdmin.
    • Строка, представляющая атрибут модели.

    Например, если существует поле модели first_name и атрибут ModelAdmin, будет использоваться поле модели.

  • Интерфейс администратора Django — Документация Django 1.9

    list_display указывает какие поля отображать на странице списка объектов.

    Если list_display не указан, Django отобразить только результат __str__()``(``__unicode__() для Python 2) объекта.

    Вы можете указать четыре варианта значений в list_display:

  • Если указано поле ForeignKey, Django покажет результат __str__() (__unicode__() для Python 2) связанного объекта.

  • ManyToManyField не поддерживается, так как это влечет к созданию SQL запроса для каждого объекта. Если вам необходимо сделать это в любом случае, создайте метод модели и используйте его в list_display. (Смотрите ниже подробности про использование методов в list_display. )

  • Если поле BooleanField или NullBooleanField, Django покажет красивую “on” или “off” иконку вместо True или False.

  • Если используется метод модели, ModelAdmin или функция, Django по умолчанию экранирует результат. Если вам нужно экранировать данные, вводимые пользователем, и не экранировать собственные теги, используйте format_html().

    Пример:

    from django.db import models
    from django.contrib import admin
    from django.utils.html import format_html
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        color_code = models.CharField(max_length=6)
    
        def colored_name(self):
            return format_html('<span>{} {}</span>',
                               self.color_code,
                               self.first_name,
                               self.last_name)
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('first_name', 'last_name', 'colored_name')
    

    Не рекомендуется, начиная с версии 1. 9: В предыдущих версиях вы могли добавить атрибут allow_tags методу, чтобы избежать экранирования. Этот атрибут устарел, безопаснее использовать format_html(), format_html_join(), или mark_safe().

  • Если значение поля None, пустая строка, или пустой итератор, Django покажет - (дефис). Вы можете переопределить это значение с помощью параметра AdminSite.empty_value_display:

    from django.contrib import admin
    
    admin.site.empty_value_display = '(None)'
    

    Вы можете также использовать AdminSite.empty_value_display:

    class PersonAdmin(admin.ModelAdmin):
        empty_value_display = 'unknown'
    

    Или для поля:

    class PersonAdmin(admin.ModelAdmin):
        list_display = ('name', 'birth_date_view')
    
        def birth_date_view(self, obj):
             return obj.birth_date
    
        birth_date_view.empty_value_display = 'unknown'
    

    Добавлено в Django 1. 9:

    Была добавлен возможность настраивать empty_value_display.

  • Если используется метод модели, ModelAdmin или функция, которая возвращает True или False, Django покажет “on” или “off” иконки, если вы добавите атрибут boolean методу или функции со значением True.

    Пример:

    from django.db import models
    from django.contrib import admin
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        birthday = models.DateField()
    
        def born_in_fifties(self):
            return self.birthday.strftime('%Y')[:3] == '195'
        born_in_fifties.boolean = True
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('name', 'born_in_fifties')
    
  • Метод __str__() (__unicode__() в Python 2) можно использовать в list_display как и любой другой метод модели:

    list_display = ('__str__', 'some_other_field')
    
  • Обычно элементы list_display, которые не являются полями модели, не могу быть использованы при сортировке (так как Django выполняет сортировку на уровне базы данных).

    Однако, если элемент list_display представляет определенное поле в базе данных, вы можете указать это добавив атрибут admin_order_field к элементу.

    Например:

    from django.db import models
    from django.contrib import admin
    from django.utils.html import format_html
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        color_code = models.CharField(max_length=6)
    
        def colored_first_name(self):
            return format_html('<span>{}</span>',
                               self.color_code,
                               self.first_name)
    
        colored_first_name.admin_order_field = 'first_name'
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('first_name', 'colored_first_name')
    

    В этом примере Django будет использовать поле first_name при сортировке по colored_first_name.

    Для обратной сортировки в admin_model_field можно использовать префикс -. Например:

    colored_first_name.admin_order_field = '-first_name'
    

    admin_order_field позволяет добавить сортировку по значению из связанных моделей. Этот пример содержит колонку “имя автора” и позволяет выполнить сортировку по ней:

    class Blog(models.Model):
        title = models.CharField(max_length=255)
        author = models.ForeignKey(Person, on_delete=models.CASCADE)
    
    class BlogAdmin(admin.ModelAdmin):
        list_display = ('title', 'author', 'author_first_name')
    
        def author_first_name(self, obj):
            return obj.author.first_name
    
        author_first_name.admin_order_field = 'author__first_name'
    
  • В list_display можно указать свойства. Однако, учитывая как свойства работают в Python, параметр short_description свойства можно указать используя функцию property(), а не декоратор @property.

    Например:

    class Person(models.Model):
        first_name = models. CharField(max_length=50)
        last_name = models.CharField(max_length=50)
    
        def my_property(self):
            return self.first_name + ' ' + self.last_name
        my_property.short_description = "Full name of the person"
    
        full_name = property(my_property)
    
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('full_name',)
    
  • Названия полей из list_display будут использованы в CSS классах, форма будет содержать класс column-<field_name> для каждого элемента <th>. Так можно определить ширину полей через CSS стили.

  • Django попытается интерпретировать каждый элемент list_display в следующем порядке:

    • Поле модели.

    • Метод или любой другой вызываемый объект.

    • Строка, представляющая атрибут ModelAdmin.

    • Строка, представляющая атрибут модели.

    Например, если существует поле модели first_name и атрибут ModelAdmin, будет использоваться поле модели.

  • Прикручиваем django-registration / Хабр

    Нужно было прикрутить регистрацию на сайт. Вспомнил про django-registration (классический django reusable app). Первое, что удивило — в исходниках не было шаблонов. Пришлось немного покопаться в интернете, поискать ответы на вопросы и поделиться результатом.

    Вобщем, скачал django-registration, почитал доки и гугл, стал подключать:

    # добавляем приложение в setting.py

    ACCOUNT_ACTIVATION_DAYS = 2 # кол-во дней для хранения кода активации

    # для отправки кода активации

    AUTH_USER_EMAIL_UNIQUE = True

    EMAIL_HOST = ‘localhost’

    EMAIL_PORT = 1025

    EMAIL_HOST_USER = »

    EMAIL_HOST_PASSWORD = »

    EMAIL_USE_TLS = False

    DEFAULT_FROM_EMAIL = ‘[email protected]

    INSTALLED_APPS = (

        ‘django.contrib.auth’,

        ‘django.contrib.contenttypes’,

        ‘django.contrib.sessions’,

        ‘django.contrib.sites’,

        ‘django. admin/’, include(admin.site.urls)),

    )

    Стартуем сервер python ./manage.py runserver 8004, открываем http://localhost:8004/accounts/register/ и получае ошибку TemplateDoesNotExist at /accounts/register/ — шаблонов то нет. Значит создаем в templates/registration шаблоны.

    # templates/registration/registration_form.html

    {% extends "base.html" %}

    {% block content %}

    <h2>Регистрация</h2>

    <form method="post" action="">

    <dl>

    {% for field in form %}

        <dt>{{ field.label_tag }}</dt>

        <dd>{{ field }}

        {% if field.help_text %}<div>{{ field.help_text }}</div>{% endif %}

        {% if field.errors %}<div>{{ field.errors }}</div>{% endif %}

        </dd>

    {% endfor %}

    </dl>

    <input type="submit" value="Зарегистрироваться" />

    </form>

    {% endblock %}

    В итоге получилась форма регистрации. Чтобы название полей звучали по-русски, надо не забыть прописать в setting.py

    LANGUAGE_CODE = 'ru-RU'  # для русской локали

    USE_I18N = True # интернационалицация по-умолчанию включена

    И чтобы завершить регистарацию, надо синхронизировать базу python ./manage.py syncdb (создается таблица registration_registrationprofile). Стоит также отметить, что по умолчанию django-registration не проверяет e-mail нового пользователя на уникальность. Чтобы поправить это, в файле registration/views.py надо поменять:

    """

    # функция использует форму RegistrationForm без проверки

    # надо заменить на RegistrationFormUniqueEmail

    def register(request, success_url=None,

                 #form_class=RegistrationForm,

                 form_class=RegistrationFormUniqueEmail,

                 profile_callback=None,

                 template_name='registration/registration_form.html',

                 extra_context=None):

    Но, как правильно поправил в комментариях lizendir — править код библиотеки — плохо. register/$’, ‘registration.views.register’, {‘form’: RegistrationFormUniqueEmail}, name=’registration_register’),

    url(», include(‘registration.urls’)),

    Для минимально-достаточного функционирования необходимо создать в templates/registration/ еще несколько файликов:

    # формирование темы письма - текстовый файл в одну строчку

    # activation_email_subject.txt

    Активация аккаунта – {{ site }}

    # текст письма

    # activation_email.txt

    Регистрация на сайте

    Для активации вашего аккаунта необходимо перейти по ссылке:

    {{ site }}/accounts/activate/{{ activation_key }}/

    Спасибо!

    # шаблон окончания регистрации

    # registration_complete.html

    {% extends «base.html»  %}

    {% block content %}

    <h2>Регистрация завершена</h2>

    Спасибо за уделённое время. На ваш e-mail отправлен

    код подтверждения. Необходимо подтвердить регистрацию,

    просто кликнув по указанной ссылке. <br/><br/>

    {% endblock %}

    # страница активации

    # activate.html

    {% extends «base.html» %}

    {% block content %}

    <h2>Активация</h2>

    Привет, {{ account }}!<br/>

    Ваша учетная запись активирована. <a href=»{% url auth_login %}»>Заходите</a> на сайт.

    <br/><br/>

    {% endblock %}

    Но чтобы регистрация прошла успешно, надо сделать тестовый mail-сервер, куда будет отправлено письмо с текстом и кодом акцивации. Благо, в Python есть быстрое решение — просто набираете в командной строке:

    python -m smtpd -n -c DebuggingServer localhost:1025

    Оставляем терминал открытым, запускает в дополнительном терминальном окне django-сервер, заходим на http://localhost:8004/accounts/register/ и регистририруемся. В почтовом дебаггере высветится текст письма в quoted-printable кодировке. Но нам достаточно скопировать и вставить строку вида example. com/accounts/activate/b3842d8f0b08a548a0372de9e79b6bd909bf8e6e/ и добавить к нашему localhost:8004. Получается: http://localhost:8004/accounts/activate/b3842d8f0b08a548a0372de9e79b6bd909bf8e6e/. Заходим и активируем аккаунт. Регистрация завершена. Ура!

    Для авторизации нам необходимы еще 2 шаблона — login.html и logout.html:

    # templates/registration/login.html

    {% extends "base.html" %}

    {% block content %}

    <h2>Авторизация</h2>

    {% if user.is_authenticated %}

    Что такое, {{ user.username }}? Вы же уже авторизорваны.

    Впрочем, всегда можно <a href=»{% url auth_logout %}»>выйти</a>.<br/><br/>

    {% else %}

    {% if form.non_field_errors %}

    {{ form.non_field_errors }}

    {% endif %}

    <form method=»post» action=»»>

    <dl>  

    {% for field in form %}

        <dt>{{ field.label_tag }}</dt>

        <dd>{{ field }}

        {% if field. help_text %}<div>{{ field.help_text }}</div>{% endif %}

        {% if field.errors %}<div>{{ field.errors }}</div>{% endif %}

        </dd>

    {% endfor %}

    </dl>

    <input type=»submit» value=»Вход» />

    </form>

       

    <script type=»text/javascript»>

    document.getElementById(‘id_username’).focus()

    </script>

     <br/><br/>

    <ul>

        <li><a href=»{% url auth_password_reset %}»>Забыли пароль?</a></li>

        <li><a href=»{% url registration_register %}»>Регистрация</a></li>

    </ul>  

    {% endif %}

    {% endblock %}

    # templates/registration/logout.html

    {% extends «base.html»  %}

    {% block content %}

    <h2>Выход</h2>

    Спасибо, что были с нами. Ждем вас снова.<br/><br/>

    {% endblock %}

    Конечно, это не всё — в registration/urls. py есть урлы для отправки забытого пароля и ресета. Но для минимального функционала достаточно. Единственное что — django-админка не показывает по умолчанию, активирован пользователь или нет. Поправим это. Сделаем новое приложение django-admin.py startapp customuseradmin, прописываем его в INSTALLED_APPS после django.contrib.admin и в customuseradmin/admin.py пишем что-то вроде:

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

    from django.contrib import admin

    from django.contrib.auth.models import User, Group

    from django.contrib.auth.admin import UserAdmin    

    admin.site.unregister(User)

    class CustomUserAdmin(UserAdmin):

        list_display = (‘username’, ’email’, ‘is_staff’,’is_active’,)

        list_filter = (‘is_staff’, ‘is_superuser’, ‘is_active’,)    

    admin.site.register(User, CustomUserAdmin)

    Теперь всё. Если где ошибся — поправьте, пожалуйста.

    Регистрация на Python Django 3 как она делается

    Автор статьи: admin

    В этой статье мы разберём, как делается регистрация Django 3 для сайта, думаю вам понравится.

    Также если вам интересен Django, то можете прочитать статью
    «Как сделать блог на Django»

    Основы регистрации на Django:

    Для начала разберём что нужно использовать, чтобы сделать простую регистрацию, нужно использовать базовый класс в Django «UserCreationForm», для создания формы и всё, но для начала нужно сделать шаблон, для начала базовый, а потом для регистрации.

    Ещё нужно создать проект и приложение на Django, для этого прочитайте статью «Быстрый старт Django».

    Делаем базовый шаблон base.html в папке templates, который находится в папке приложения, вот его код.

    <!DOCTYPE html>

    <html lang=»ru»>

    <head>

        <meta charset=»UTF-8″>

        <meta name=»viewport» content=»width=device-width, initial-scale=1, shrink-to-fit=no»>

        <title>{% block title %}{% endblock %}</title>

    </head>

    <body>

        <main>

            {% block content %}{% endblock %}

        </main>

    </body>

    </html>

    Это просто базовый шаблон, в начале мы делаем блок для вставки заголовка, а потом в main, делаем блог в котором будет хранится контент.

    Теперь сделаем шаблон для регистрации, в папке «pages», назовём его «registr.html», вот он:

    {% extends ‘base.html’ %}

     

    {% block title %}Регистрация{% endblock %}

     

    {% block content %}

        <h3>Регистрация</h3>

        <form method=»post»>

            {% csrf_token %}

            {{ form.as_p }}

            <button type=»submit»>Отправить</button>

        </form>

    {% endblock %}

    Тут уже наследуем его из базового класса, и где должен быть заголовок пишем регистрация, и внутри контента, задаём форму, её будем передавать в файле «views.py».

    Дальше делаем файл в котором будем рендарить страницу регистрации, это «views.py», в нём создадим функцию registr.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    # Подключение для рендера

    from django. shortcuts import render

    # Подключение стандартной формы для регистрации

    from django.contrib.auth.forms import UserCreationForm

     

     

    # Функция регистрации

    def regist(request):

        # Массив для передачи данных шаблонны

        data = {}

        # Проверка что есть запрос POST

        if request.method == ‘POST’:

            # Создаём форму

            form = UserCreationForm(request.POST)

            # Валидация данных из формы

            if form.is_valid():

                # Сохраняем пользователя

                form.save()

                # Передача формы к рендару

                data[‘form’] = form

                # Передача надписи, если прошло всё успешно

                data[‘res’] = «Всё прошло успешно»

                # Рендаринг страницы

                return render(request, ‘pages/registr.html’, data)

        else: # Иначе

            # Создаём форму

            form = UserCreationForm()

            # Передаём форму для рендеринга

            data[‘form’] = form

            # Рендаринг страницы

            return render(request, ‘pages/registr. html’, data)

    Давайте разберём этот код, сперва мы подключаем все нужные библиотеки/компоненты, потом создаём функцию которая будет отвечать за всю логику, и в самом начале делаем массив который будет передаваться в качестве контекста.

    Потом пишем условие, если есть post запрос, там внутри опять создаём объект класса UserCreationForm(), в качестве параметра передаём ему то, что у нас было в POST запросе и делаем валидацию формы.

    Если валидация прошла успешно, то сохраняем пользователя и передаём сообщение «Всё прошло успешно», редарим страницу.

    Если же, нет POST запроса, то просто передаём форму в качестве контекста и рендарим страницу.

    Как видите всё очень просто, теперь добавляем страницу в «url.py», которая находится в папке с файлом «settings.py».

    from django.contrib import admin

    from main import views

     

    urlpatterns = [

        path(‘admin/’, admin.site.urls),

        path(‘registr/’, views. registr),

    ]

    Переходим на страницу регистрации и вот что должно получится.

    Всё должно работать так как надо.

    Как добавить поля к регистрации:

    Также иногда нужно добавлять свои поля для регистрации, для этого нужно добавить файл с формой, который будет называя «forms.py», а вот его код.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    # Подключаем компонент для работы с формой

    from django import forms

    # Подключаем компонент UserCreationForm

    from django.contrib.auth.forms import UserCreationForm

    # Подключаем модель User

    from django.contrib.auth.models import User

     

     

    # Создаём класс формы

    class RegistrForm(UserCreationForm):

      # Добавляем новое поле Email

      email = forms.EmailField(max_length=254, help_text=’This field is required’)

      

      # Создаём класс Meta

      class Meta:

        # Свойство модели User

        model = User

        # Свойство назначения полей

        fields = (‘username’, ’email’, ‘password1’, ‘password2’, )

    В начале мы подключаем все нужные компоненты для создания новой формы регистрации, потом создаём класс RegistrForm и унаследуем его от UserCreationForm, внутри идёт свойство для нового поля Email, которое как понятно из название для электронной почты.

    Дальше класс Meta, он предназначен для объявления и настройки полей, вначале свойство для обозначения с какой моделью работать, в нашем случае User, второе свойство fields, обозначает какие поля использовать.

    После того как создали этот класс нужно не много изменить файл «views.py», вот он.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    # Подключение для рендера

    from django.shortcuts import render

    # Подключение новой формы для регистрации

    from .forms import RegistrForm

     

     

    # Функция регистрации

    def regist(request):

        # Массив для передачи данных шаблонны

        data = {}

        # Проверка что есть запрос POST

        if request. method == ‘POST’:

            # Создаём форму

            form = RegistrForm(request.POST)

            # Валидация данных из формы

            if form.is_valid():

                # Сохраняем пользователя

                form.save()

                # Передача формы к рендару

                data[‘form’] = form

                # Передача надписи, если прошло всё успешно

                data[‘res’] = «Всё прошло успешно»

                # Рендаринг страницы

                return render(request, ‘pages/registr.html’, data)

        else: # Иначе

            # Создаём форму

            form = RegistrForm()

            # Передаём форму для рендеринга

            data[‘form’] = form

            # Рендаринг страницы

            return render(request, ‘pages/registr.html’, data)

    Тут я не буду особо рассказывать что к чему, так как единственное что мы сделали это заменили UserCreationForm, на RegistrForm и всё, вот что получилось.

    Как видите у нас появилась новое поле для Email, которое используете для регистрации.

    Также стоит упомянуть про создание регистрации для своей модели пользователя, там всё точно также, просто в качестве свойства fields используете поля из модели, в качестве свойства model, также используете свои, вот и всё.

    Вывод:

    В этой статье вы прочитаете, как делается регистрация на Python Django 3, тут мы показали как сделать самый как сделать используя базовую форму регистрации и как её дополнить.

    Подписываетесь на соц-сети:

    Оценка:

    (Пока оценок нет)

    Загрузка…

    Также рекомендую:

    Установка Django — Раздел помощи

    Для установки и создания проекта на фреймворке Django версии, отличной от серверной, потребуется выполнить действия, описанные ниже. Установка Django осуществляется посредством протокола SSH: 

    1. Для установки необходимо воспользоваться утилитой virtualenv. Создать и активировать виртуальное окружение для Вашей версии фреймворка Django можно в каталоге «.djangovenv»:

    2. Далее необходимо установить требуемую версию фреймворка в виртуальном окружении (в данном случае выбрана версия Django 1.7.1):

    3. В следующем шаге необходимо перейти в каталог сайта, где будет расположен сам проект. В качестве примера выбран каталог «~/site1» на который направлен домен:

    4. После этого требуется создать проект Django и деактивировать виртуальное окружение:

    При создании возможно заменить имя проекта «SWeb_DjangoSite» на нужное.

    5. Необходимо убедитьcя, что каталог с проектом был создан и переместить его содержимое в каталог «public_html».

    Проще всего это сделать удалив существующий каталог «public_html» и переименовав каталог с самим проектом:

     Далее необходимо перейти в каталог:

    6. Далее требуется открыть файл «wsgi. py» в подкаталоге с именем проекта с помощью текстового редактора и указать полные пути к установленному фреймворку, проекту и виртуальному окружению.

    Полный путь к текущему каталогу можно узнать, выполнив команду «pwd»:

    В данном случае содержимое файла следующее:

    Текст «ИМЯ_ПРОЕКТА» необходимо изменить на имя созданного проекта, в нашем случае это SWeb_DjangoSite.

    7. В каталоге сайта создать файл .htaccess с указанием полного пути к файлу «wsgi.py».

    В данном случае содержимое файла «~/site1/public_html/.htaccess» следующее:

    Текст «ИМЯ_ПРОЕКТА» также необходимо изменить на имя созданного проекта.

    8. В панели управления хостинга в разделе «Сайты» необходимо убедиться, что для домена выбрана версия Apache 2.2 + mod_passenger + mod_wsgi (wp).

    Важно: Модуль mod_wsgi использует python 2. 7.

    Django: admin.site.register выпуск — CodeRoad

    Я использую django-simple-history https://django-simple-history.readthedocs.org/en/latest/index.html для управления историей моего сайта и django-ajax-select https://github.com/crucialfelix/django-ajax-selects в моем веб-приложении. Проблема, с которой я сталкиваюсь, находится в части регистра администратора. Первоначально, когда я просто использовал django-ajax-select, мой admin.py был бы похож

    class DeviceAdmin(AjaxSelectAdmin):
        formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows': 6, 'cols': 50})},
    }
        list_display = ('__unicode__', 'Tag_ID', 'IMEI', 'Device_Name', 'Location', 'Employee_Name_Owner')
        list_filter = ('Location__Location', 'Device_Name', 'Manufacturer__Manufacturer', 'Phone_Carrier__Phone_Carrier',
                   'Device_Type__Device_Type', 'Service_Status__Service_Status', 'Purchase_Date', 'Created_At',
                   'Updated_At')
        search_fields = ('Tag_ID', 'IMEI', 'Phone_Number', 'MEID_HEX', 'MEID_DEC', 'Device_Name', 'Serial_Number',
                     'Employee_Name_Owner__Email')
    admin. site.register(Device,DeviceAdmin)
    

    Но теперь, когда я пытаюсь использовать django-sipmle-history в соответствии с его документом, я должен использовать admin.site.register, как

    admin.site.register(Device, SimpleHistoryAdmin)
    

    Наконец, из-за использования SimpleHistoryAdmin в admin.site.register я теряю все функциональные возможности моего класса DeviceAdmin. Мне нужен способ, чтобы использовать DeviceAdmin и SimpleHistory администратора .

    PS: извиняется за любое дублирование или задает простой вопрос.

    python

    django

    python-2.7

    django-admin

    Поделиться

    Источник


    Vzor Leet    

    14 июля 2014 в 16:16

    1 ответ


    • TypeError: object() не принимает никаких параметров при попытке admin.site.register

      все другие модели зарегистрированы успешно таким же образом, кроме одной: попытка admin. site.register(ProductImage, ProductImageAdmin) in products/models.py : class ProductImage(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, default=None) image…

    • django inspectdb в админке сайта (admin.site.register)

      Мне дали небольшую устаревшую базу данных (mysql) для работы, и поэтому я попытался использовать команду inspectdb в django. Итак, я использую что-то вроде: python manage.py inspectdb > models.py Он отлично работает, и я беру models.py и копирую созданный им класс в свое приложение (searchapp)…



    2

    Таким образом, вы в основном хотите, чтобы ваша страница администратора для Device расширяла как DeviceAdmin , так и SimpleHistoryAdmin , поэтому вы получаете функциональность обоих.

    Попробовать следующее:

    class DeviceAdmin(AjaxSelectAdmin):
        . .. code that you have above ...
    
    class DeviceAdminWithHistory(DeviceAdmin, SimpleHistoryAdmin):
        pass
    
    admin.site.register(Device, DeviceAdminWithHistory)
    

    Существует вероятность, что два класса DeviceAdmin и SimpleHistoryAdmin могут иметь перекрывающиеся поля или методы. Но после просмотра источника для SimpleHistoryAdmin и AjaxSelectAdmin, похоже, что выше должно работать.

    Поделиться


    Sohan Jain    

    14 июля 2014 в 20:13


    Похожие вопросы:

    Django пользовательские admin admin.site.register + admin.site.unregister противоречивые AlreadyRegistered + NotRegistered на 1 HTTP вам (Apache + мод тут WSGI)

    Во время 1-го HTTP GET (сразу после перезагрузки WSGI в режиме демона) admin.site.unregister создает исключение NotRegistered, но admin.site.register создает исключение AlreadyRegistered (catch-22?)…

    Django admin.site.register не добавляет администратора моего приложения

    как Новичок django (у меня есть некоторый опыт работы с другими python веб-фреймами, такими как turbogears и bottle, но я изучаю django), я пытаюсь автоматически создать административное управление…

    Регистрируйте каждую таблицу / класс из приложения на странице Django admin

    У меня есть приложение с именем doors и мой models.py для приложения имеет 10 tables/class. под моим admin.py , как я могу зарегистрировать каждую модель в файле models.py ? Например, в настоящее…

    TypeError: object() не принимает никаких параметров при попытке admin.site.register

    все другие модели зарегистрированы успешно таким же образом, кроме одной: попытка admin.site.register(ProductImage, ProductImageAdmin) in products/models.py : class ProductImage(models.Model):…

    django inspectdb в админке сайта (admin.site.register)

    Мне дали небольшую устаревшую базу данных (mysql) для работы, и поэтому я попытался использовать команду inspectdb в django. Итак, я использую что-то вроде: python manage.py inspectdb > models.py…

    Вложенный встроенный в Django Admin

    У меня есть следующий сценарий, где есть три модели следующим образом, которые должны отображаться вложенными в DJango admin. Я использую выпуск Django 1.6 и примененные настройки, как положено в…

    Django-вопросы администратора

    Я знаю, что подобные вопросы были заданы здесь, в stackoverflow, но это не просто вопрос, а подтверждение моего основного понимания. Это относится к тем, кто обладает знанием в Django году. Моя…

    django » admin.site.register(…)» только для суперпользователя

    Я хотел бы показать модель в бэкэнде администратора только суперпользователю, но не сотрудникам, возможно ли это? образец: check which user is logged if superuser admin.site.register(model_1)…

    Экспорт модели объектов Django в CSV

    Я хочу создать дополнительное действие для администратора в django-admin. Я хочу иметь возможность экспортировать данные в формате CSV. Я написал следующий код в моем admin.py : from django.contrib…

    Django admin.site.register бросает TypeError для класса моделей

    Это следующий вопрос к этому вопросу. Я хотел бы автоматизировать импорт классов из файла django models.py , а затем зарегистрировать каждый с admin.site.register() . Вот мой код: from…

    Маршрутизаторы

    — Django REST framework

    GitHub

    Следующие

    Предыдущая

    Поиск

    Фреймворк Django REST

    • Дом
    • Учебник

      • Быстрый старт
      • 1 — Сериализация
      • 2 — Запросы и ответы
      • 3 — Просмотры на основе классов
      • 4 — Аутентификация и разрешения
      • 5 — Отношения и гиперссылки API
      • 6 — Viewsets и маршрутизаторы
    • Руководство API

      • Запросы
      • Ответы
      • Просмотры
      • Общие представления
      • Наборы просмотров
      • Маршрутизаторы
      • Парсеры
      • Рендереры
      • Сериализаторы
      • Поля сериализатора
      • Отношения сериализатора
      • Валидаторы
      • Аутентификация
      • Разрешения
      • Кеширование
      • Дросселирование
      • Фильтрация
      • Пагинация
      • Управление версиями
      • Согласование содержания
      • Метаданные
      • Схемы
      • Суффиксы формата
      • Возврат URL-адресов
      • Исключения
      • Коды состояния
      • Тестирование
      • Настройки
    • Темы

      • Документирование вашего API
      • Клиенты API
      • Интернационализация
      • AJAX, CSRF и CORS
      • HTML и формы
      • Улучшения браузера
      • Доступный для просмотра API
      • ОТДЫХ, гипермедиа и ненависть
    • Сообщество

      • Учебники и ресурсы
      • Сторонние пакеты
      • Участие в REST framework
      • Управление проектом
      • Примечания к выпуску
      • 3.12 Объявление
      • 3.11 Объявление
      • 3.10 Объявление
      • 3.9 Объявление
      • 3.8 Объявление
      • 3.7 Объявление
      • 3.6 Объявление
      • 3.5 Объявление
      • 3.4 Объявление
      • 3.3 Объявление

    9.Аутентификация пользователя — как танцевать с Django 1.7

    Цель этой следующей части руководства — познакомить вас с механизмами аутентификации пользователей, предоставляемыми Django. Мы будем использовать приложение аутентификации, входящее в состав стандартной установки Django в пакете django.contrib.auth. Согласно официальной документации Django по аутентификации, приложение состоит из следующих аспектов.

    • Пользователи.
    • Разрешения: серия двоичных флагов (например,грамм. да / нет), определяя, что пользователь может или не может делать.
    • Группы: метод применения разрешений более чем к одному пользователю.
    • Настраиваемая система хеширования паролей : необходим для обеспечения безопасности данных.
    • Формы и инструменты просмотра для входа в систему пользователей, или ограничения содержимого.

    Django может многое сделать для вас в области аутентификации пользователей. Мы рассмотрим основы, чтобы вы начали. Это поможет вам обрести уверенность в доступных инструментах и ​​лежащих в их основе концепциях.

    9.1. Настройка аутентификации

    Прежде чем вы сможете поиграть с предложением аутентификации Django, вам нужно убедиться, что соответствующие настройки присутствуют в файле settings.py вашего проекта Rango.

    В файле settings.py найдите кортеж INSTALLED_APPS и убедитесь, что указаны типы django.contrib.auth и django.contrib.content, чтобы он выглядел, как показано ниже:

     INSTALLED_APPS = (
        'django.contrib.admin',
        'джанго.contrib.auth ',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'ранго',
    )
     

    В то время как django.contrib.auth предоставляет Django доступ к системе аутентификации, django.contrib.contenttypes используется приложением аутентификации для отслеживания моделей, установленных в вашей базе данных.

    Примечание

    Помните, что если вам нужно было добавить приложения аутентификации в кортеж INSTALLED_APPS, вам нужно будет обновить свою базу данных с помощью $ python manage.py migrate команда.

    Пароли по умолчанию хранятся в Django с использованием алгоритма PBKDF2, что обеспечивает хороший уровень безопасности для данных вашего пользователя. Вы можете узнать больше об этом в официальной документации Django о том, как django хранит пароли. В документации также объясняется, как использовать разные хешеры паролей, если вам требуется более высокий уровень безопасности.

    Если вам нужен больший контроль над хешированием паролей, то в settings.py добавьте кортеж, чтобы указать PASSWORD_HASHERS:

     PASSWORD_HASHERS = (
    'джанго.contrib.auth.hashers.PBKDF2PasswordHasher ',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    )
     

    Django будет использовать первый хешер в PASSWORD_HASHERS, то есть settings.PASSWORD_HASHERS [0]. Если вы хотите использовать более безопасный хешер, вы можете установить Bcrypt (см. Https://pypi.python.org/pypi/bcrypt/), используя pip install bcrypt, а затем установить PASSWORD_HASHERS равным:

     PASSWORD_HASHERS = (
            'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher ',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    )
     

    Однако, чтобы начать работу, вам не нужно явно указывать PASSWORD_HASHERS, и в этом случае Django по умолчанию django.contrib.auth.hashers.PBKDF2PasswordHasher.

    9.2. Модель пользователя

    Ядром системы аутентификации Django является объект User, расположенный по адресу django.contrib.auth.models.User. Объект User представляет каждого человека, взаимодействующего с приложением Django.В документации Django по объектам «Пользователь» указано, что они используются для разрешения таких аспектов системы аутентификации, как ограничение доступа, регистрация новых профилей пользователей и связывание создателей с контентом сайта.

    Модель User имеет пять основных атрибутов. Их:

    • имя пользователя для учетной записи пользователя;
    • пароль учетной записи;
    • адрес электронной почты пользователя;
    • имя пользователя; и
    • фамилия пользователя.

    Модель также поставляется с другими атрибутами, такими как is_active (который определяет, активна ли конкретная учетная запись). Ознакомьтесь с официальной документацией Django по модели пользователя, чтобы получить полный список атрибутов, предоставляемых базовой моделью пользователя.

    9.3. Дополнительные атрибуты пользователя

    Если вы хотите включить другие атрибуты, отличные от тех, которые предусмотрены моделью User, у вас есть два варианта: (1) расширить модель пользователя, создав новую модель пользователя из AbstractUser (см. Официальный документ Django о расширении Django по умолчанию user`_ или (2) создайте модель с однозначной связью с моделью User. В этом руководстве мы создадим связанную модель. Для нашего приложения Rango мы хотим включить еще два дополнительных атрибута для каждой учетной записи пользователя. В частности, мы хотим включить:

    • URLField, позволяющий пользователю Rango указать свой собственный веб-сайт; и
    • ImageField, который позволяет пользователям указывать изображение для своего профиля пользователя.

    Этого можно достичь, создав дополнительную модель в файле models.py Rango. Давайте добавим новую модель под названием UserProfile:

    .

     класс UserProfile (models.Model):
        # Эта строка обязательна. Связывает UserProfile с экземпляром модели User.
        user = models.OneToOneField (Пользователь)
    
        # Дополнительные атрибуты, которые мы хотим включить.
        website = models.URLField (blank = True)
        picture = models.ImageField (upload_to = 'profile_images', blank = True)
    
        # Переопределите метод __unicode __ (), чтобы вернуть что-то значимое!
        def __unicode __ (сам):
            вернуть себя.user.username
     

    Обратите внимание, что мы ссылаемся на модель User с помощью отношения «один к одному». Поскольку мы ссылаемся на модель User по умолчанию, нам необходимо импортировать ее в файл models.py:

     от пользователя django.contrib.auth.models import
     

    Может возникнуть соблазн добавить эти дополнительные поля путем прямого наследования от модели User. Однако, поскольку другим приложениям также может потребоваться доступ к модели User, не рекомендуется использовать наследование, а вместо этого использовать отношения «один к одному».

    Для Rango мы добавили два поля для заполнения нашего профиля пользователя и предоставили метод __unicode __ () для возврата значимого значения, когда запрашивается представление в Юникоде экземпляра модели UserProfile.

    Для веб-сайта и изображения с двумя полями мы установили blank = True для обоих. Это позволяет при необходимости оставлять каждое из полей пустым, что означает, что пользователям не нужно указывать значения атрибутов, если они не хотят.

    Обратите внимание, что поле ImageField имеет атрибут upload_to.Значение этого атрибута объединяется с параметром MEDIA_ROOT проекта, чтобы указать путь, по которому будут сохраняться загруженные изображения профиля. Например, MEDIA_ROOT из / tango_with_django_project / media / и атрибут upload_to в profile_images приведут к тому, что все изображения профиля будут сохранены в каталоге / tango_with_django_project / media / profile_images /.

    Предупреждение

    Поле Django ImageField использует библиотеку изображений Python (PIL). Еще в главе , этикетка требований , мы обсуждали установку PIL вместе с Django в вашу установку. Если у вас не установлен PIL, вам нужно установить его сейчас. Если вы этого не сделаете, вы увидите исключения, в которых будет указано, что модуль pil не может быть найден!

    Определив нашу модель UserProfile, мы теперь редактируем файл admin.py Rango, чтобы включить новую модель UserProfile в веб-интерфейс администрирования Django. В файле admin.py добавьте следующую строку.

     от rango.модели импортируют UserProfile
    
    admin.site.register (Профиль пользователя)
     

    Примечание

    Помните, что ваша база данных должна обновляться при создании новой модели. Запустите $ python manage.py makemigrations rango из вашего терминала, чтобы создать сценарии миграции для новой модели UserProfile. Затем запустите $ python manage.py migrate

    9,4. Создание регистрации пользователя Представление и шаблон

    Создав нашу инфраструктуру аутентификации, мы можем приступить к ее наращиванию, предоставив пользователям нашего приложения возможность создавать новые учетные записи пользователей.Мы добьемся этого путем создания новой комбинации представления и шаблона.

    Примечание

    Важно отметить, что существует несколько готовых пакетов для регистрации пользователей, которые сокращают массу хлопот по созданию собственных форм регистрации и входа в систему. Тем не менее, полезно почувствовать лежащую в основе механику, потому что использует такие приложения. Это также укрепит ваше понимание работы с формами, того, как расширить пользовательскую модель и как загружать медиа.

    Чтобы предоставить возможность регистрации пользователей, мы выполним следующие шаги:

    1. Создайте пользовательскую форму и пользовательскую форму профиля.
    2. Добавьте представление для обработки создания нового пользователя.
    3. Создайте шаблон, отображающий UserForm и UserProfileForm.
    4. Сопоставьте URL-адрес созданному представлению.
    5. Ссылка на страницу индекса на страницу реестра

    9.4.1. Создание UserForm и UserProfileForm

    В ранго / формах.py, теперь нам нужно создать два класса, унаследованных от forms.ModelForm. Мы создадим один для базового класса User, а также один для новой модели UserProfile, которую мы только что создали. Два класса-наследника ModelForm позволяют нам отображать HTML-форму, отображающую необходимые поля формы для конкретной модели, что избавляет нас от значительного объема работы. Аккуратно!

    В rango / forms.py давайте создадим два наших класса, которые наследуются от forms.ModelForm. Добавьте в модуль следующий код.

     класс UserForm (forms.ModelForm):
        пароль = forms.CharField (widget = forms.PasswordInput ())
    
        класс Meta:
            model = Пользователь
            fields = ('имя пользователя', 'электронная почта', 'пароль')
    
    класс UserProfileForm (forms.ModelForm):
        класс Meta:
            model = UserProfile
            fields = ('сайт', 'изображение')
     

    Вы заметите, что внутри обоих классов мы добавили вложенный мета-класс. Как следует из названия вложенного класса, все, что находится внутри вложенного класса Meta, описывает дополнительные свойства конкретного класса ModelForm, которому он принадлежит.Каждый мета-класс должен как минимум предоставлять поле модели, которое ссылается на модель, к которой должен относиться класс-наследник ModelForm. Таким образом, наш класс UserForm связан, например, с моделью User. Начиная с Django 1.7, вам также необходимо указать поля или исключить, чтобы указать, какие поля, связанные с моделью, должны присутствовать в форме.

    Здесь мы хотим показать только поля, имя пользователя, адрес электронной почты и пароль, связанные с моделью User, а также веб-сайт и изображение, связанные с моделью UserProfile.Для поля пользователя в UserProfile нам нужно будет установить эту связь при регистрации пользователя.

    Вы также заметите, что UserForm включает определение атрибута пароля. Хотя экземпляр модели User по умолчанию содержит атрибут пароля, визуализированный элемент HTML-формы не скроет пароль. Если пользователь вводит пароль, он будет виден. Обновив атрибут пароля, мы можем указать, что экземпляр CharField должен скрывать ввод пользователя от посторонних глаз с помощью виджета PasswordInput ().

    Наконец, не забудьте включить необходимые классы в верхней части модуля forms.py!

     из форм импорта django
    из django.contrib.auth.models импортировать пользователя
    из rango.models импортировать категорию, страницу, профиль пользователя
     

    9.4.2. Создание реестра () Просмотр

    Затем нам нужно обработать как визуализацию формы, так и обработку входных данных формы. В файле views.py Rango добавьте следующую функцию просмотра:

     из rango.forms import UserForm, UserProfileForm
    
    def регистр (запрос):
    
        # Логическое значение, сообщающее шаблону, была ли регистрация успешной.# Изначально установите значение False. Код меняет значение на True при успешной регистрации.
        зарегистрировано = Ложь
    
        # Если это HTTP POST, нас интересует обработка данных формы.
        если request.method == 'POST':
            # Попытка получить информацию из необработанной информации формы.
            # Обратите внимание, что мы используем как UserForm, так и UserProfileForm.
            user_form = UserForm (данные = request.POST)
            profile_form = UserProfileForm (данные = request.POST)
    
            # Если две формы действительны ...
            если user_form.is_valid () и profile_form.is_valid ():
                # Сохранение данных формы пользователя в базе данных.
                user = user_form.save ()
    
                # Теперь хешируем пароль с помощью метода set_password.
                # После хеширования мы можем обновить объект пользователя.
                user.set_password (пароль пользователя)
                user.save ()
    
                # Теперь отсортируйте экземпляр UserProfile.
                # Поскольку нам нужно установить атрибут пользователя самостоятельно, мы устанавливаем commit = False.
                # Это задерживает сохранение модели до тех пор, пока мы не будем готовы избежать проблем с целостностью.profile = profile_form.save (фиксация = False)
                profile.user = пользователь
    
                # Пользователь предоставил изображение профиля?
                # Если это так, нам нужно получить его из формы ввода и поместить в модель UserProfile.
                если в request.FILES есть 'изображение':
                    profile.picture = request.FILES ['изображение']
    
                # Теперь сохраняем экземпляр модели UserProfile.
                profile.save ()
    
                # Обновите нашу переменную, чтобы сообщить, что регистрация шаблона прошла успешно.зарегистрировано = True
    
            # Неверная форма или формы - ошибки или что-то еще?
            # Распечатать проблемы на терминал.
            # Они также будут показаны пользователю.
            еще:
                распечатать user_form.errors, profile_form.errors
    
        # Это не HTTP POST, поэтому мы визуализируем нашу форму с помощью двух экземпляров ModelForm.
        # Эти формы будут пустыми, готовыми для ввода пользователем.
        еще:
            user_form = UserForm ()
            profile_form = UserProfileForm ()
    
        # Визуализировать шаблон в зависимости от контекста.вернуть рендер (запрос,
                'rango / register.html',
                {'user_form': user_form, 'profile_form': profile_form, 'registration': зарегистрировано})
     

    Представление намного сложнее? Сначала это может показаться так, но на самом деле это не так. Единственная добавленная сложность из нашего предыдущего представления add_category () — необходимость обрабатывать два отдельных экземпляра ModelForm — один для модели User и один для модели UserProfile. Нам также необходимо обработать изображение профиля пользователя, если он или она решит загрузить его.

    Мы также устанавливаем связь между двумя экземплярами модели, которые мы создаем. После создания нового экземпляра модели User мы ссылаемся на него в экземпляре UserProfile с помощью строки profile.user = user. Здесь мы заполняем пользовательский атрибут формы UserProfileForm, который мы скрыли от пользователей в Разделе 9.4.1.

    9.4.3. Создание шаблона регистрации

    Теперь создайте новый файл шаблона, rango / register.html и добавьте следующий код:

     
    
        
             Ранго 
        
    
        
            

    Зарегистрируйтесь в Rango

    {% если зарегистрировано%} Ранго говорит: Спасибо за регистрацию! Вернуться на главную страницу.
    {% else%} Ранго говорит: Зарегистрируйтесь здесь!
    {% csrf_token%} ) элемент. Это гарантирует, что каждый элемент появится в новой строке, чтобы все выглядело аккуратнее. -> {{user_form.as_p}} {{profile_form.as_p}}
    {% endif%}

    В этом шаблоне HTML используется зарегистрированная переменная, которую мы использовали в нашем представлении, которая указывает, была ли регистрация успешной или нет. Обратите внимание, что значение registration должно быть False, чтобы шаблон отображал форму регистрации — в противном случае, помимо заголовка, отображается только сообщение об успешном завершении.

    Предупреждение

    Вы должны знать об атрибуте enctype для элемента

    . Если вы хотите, чтобы пользователи загружали файлы из формы, абсолютно необходимо должно , чтобы установить для enctype значение multipart / form-data. Эта комбинация атрибута и значения предписывает вашему браузеру отправлять данные формы особым способом обратно на сервер. По сути, данные, представляющие ваш файл, разбиваются на серию частей и отправляются. Для получения дополнительной информации ознакомьтесь с этим отличным ответом на Stack Overflow.register / $ ‘, views.register, name =’ register ‘), # ДОБАВИТЬ НОВЫЙ ШАБЛОН!
    )

    Новый добавленный шаблон указывает URL / rango / register / на представление register ().

    9.4.5. Связать вместе

    Наконец, мы можем добавить ссылку, указывающую на этот URL, в наш шаблон домашней страницы index.html. Под ссылкой на страницу добавления категории добавьте следующую гиперссылку.

      Зарегистрируйтесь здесь 
     

    9.4.6. Демо

    Легко! Теперь у вас будет новая гиперссылка с текстом «Зарегистрироваться здесь», по которой вы попадете на страницу регистрации.Попробуйте прямо сейчас! Запустите сервер разработки Django и попробуйте зарегистрировать новую учетную запись пользователя. Загрузите изображение профиля, если хотите. Ваша регистрационная форма должна выглядеть, как показано на рисунке.

    Рисунок 1. Снимок экрана, показывающий базовую форму регистрации, которую вы создаете в рамках этого руководства.

    Увидев сообщение о том, что ваши данные были успешно зарегистрированы, база данных должна иметь две новые записи в своих таблицах, соответствующих моделям User и UserProfile.

    9,5. Добавление функции входа в систему

    Теперь, когда возможность регистрировать учетные записи завершена, нам нужно добавить функцию входа в систему. Для этого нам потребуется выполнить следующий рабочий процесс:

    • Создать учетную запись для обработки учетных данных пользователя
    • Создание шаблона входа в систему для отображения формы входа
    • Сопоставьте представление входа с URL-адресом
    • Укажите ссылку для входа со страницы индекса

    9.5.1. Создание логина () Просмотр

    В рейтинге / просмотрах.py создайте новую функцию с именем user_login () и добавьте следующий код:

     def user_login (запрос):
    
        # Если запрос является HTTP POST, попробуйте вытащить соответствующую информацию.
        если request.method == 'POST':
            # Соберите имя пользователя и пароль, предоставленные пользователем.
            # Эта информация получена из формы входа.
                    # Мы используем request.POST.get ('') вместо request.POST [''],
                    # потому что request.POST.get ('') возвращает None, если значение не существует,
                    # пока request.POST [''] вызовет исключение ключевой ошибки
            username = request.POST.get ('имя пользователя')
            пароль = request.POST.get ('пароль')
    
            # Используйте оборудование Django, чтобы попытаться проверить, есть ли имя пользователя / пароль
            # комбинация допустима - возвращается объект User, если он есть.
            пользователь = аутентификация (имя пользователя = имя пользователя, пароль = пароль)
    
            # Если у нас есть объект User, детали верны.# Если None (способ представления отсутствия значения в Python), пользователь не
            Обнаружены # с соответствующими учетными данными.
            если пользователь:
                # Аккаунт активен? Это могло быть отключено.
                если user.is_active:
                    # Если учетная запись действительна и активна, мы можем войти в систему.
                    # Мы отправим пользователя обратно на главную страницу.
                    логин (запрос, пользователь)
                    вернуть HttpResponseRedirect ('/ rango /')
                еще:
                    # Использовалась неактивная учетная запись - без входа!
                    return HttpResponse ("Ваша учетная запись Rango отключена.")
            еще:
                # Были предоставлены неверные данные для входа. Итак, мы не можем авторизовать пользователя.
                print "Недействительные данные для входа: {0}, {1}". формат (имя пользователя, пароль)
                return HttpResponse ("Указаны неверные данные для входа.")
    
        # Запрос не является HTTP POST, поэтому отобразите форму входа.
        # Этот сценарий, скорее всего, будет HTTP GET.
        еще:
            # Нет переменных контекста для передачи в систему шаблонов, поэтому
            # пустой объект словаря ...
            return render (request, 'rango / login.html ', {})
     

    Этот взгляд может показаться довольно сложным, поскольку он должен обрабатывать множество ситуаций. Как и в предыдущих примерах, представление user_login () обрабатывает и обрабатывает форму.

    Во-первых, если доступ к представлению осуществляется через метод HTTP GET, отображается форма входа в систему. Однако, если форма была отправлена ​​с помощью метода HTTP POST, мы можем обработать форму.

    Если отправлена ​​действительная форма, имя пользователя и пароль извлекаются из формы. Эти данные затем используются для попытки аутентификации пользователя (с помощью функции Authenticate () Django).Authenticate () затем возвращает объект User, если комбинация имени пользователя и пароля существует в базе данных, или None, если совпадения не найдено.

    Если мы извлекаем объект User, мы можем затем проверить, активна или неактивна учетная запись, и вернуть соответствующий ответ браузеру клиента.

    Однако, если отправлена ​​недействительная форма, поскольку пользователь не добавил и имя пользователя, и пароль, форма входа возвращается пользователю с сообщениями об ошибках формы (т.е. имя пользователя / пароль отсутствуют).

    Особый интерес в приведенном выше примере кода представляет использование встроенного механизма Django для помощи в процессе аутентификации. Обратите внимание на использование функции Authenticate (), чтобы проверить, соответствуют ли предоставленные имя пользователя и пароль действительной учетной записи пользователя, и функции login (), чтобы указать Django, что пользователь должен войти в систему.

    Вы также заметите, что мы используем новый класс HttpResponseRedirect. Судя по названию, ответ, сгенерированный экземпляром класса HttpResponseRedirect, сообщает браузеру клиента перенаправить на URL-адрес, который вы указываете в качестве аргумента.Обратите внимание, что это вернет код состояния HTTP 302, который обозначает перенаправление, в отличие от кода состояния 200, то есть ОК. См. Официальную документацию Django по перенаправлению, чтобы узнать больше.

    Все эти функции и классы предоставляются Django, поэтому вам необходимо импортировать их, поэтому добавьте в rango / views.py следующий импорт:

     из django.contrib.auth импорт аутентификации, логин
    из django.http import HttpResponseRedirect, HttpResponse
     

    9.5.2. Создание шаблона входа

    После создания нового представления нам нужно будет создать новый шаблон, позволяющий пользователям входить в систему. Хотя мы знаем, что шаблон будет находиться в каталоге templates / rango /, мы предоставим вам определить имя файла. Посмотрите на приведенный выше пример кода, чтобы определить имя. В новый файл шаблона добавьте следующий код:

     
    
        
            
             Ранго 
        
    
        
            

    Войти в Rango

    {% csrf_token%} Имя пользователя:
    Пароль:

    Убедитесь, что вы сопоставили атрибуты имени входа с теми, которые вы указали в представлении user_login () — i.логин / $ ‘, views.user_login, name =’ login ‘),
    )

    9.5.4. Связать вместе

    Наш последний шаг — предоставить пользователям Rango удобную ссылку для доступа к странице входа. Для этого мы отредактируем шаблон index.html внутри каталога templates / rango /. Найдите ранее созданные ссылки для добавления категории и регистрации и добавьте под ними следующую гиперссылку. Вы можете добавить разрыв строки (
    ) перед ссылкой.

      Войти 
     

    При желании вы также можете изменить заголовок страницы индекса, чтобы предоставить персонализированное сообщение, если пользователь вошел в систему, и более общее сообщение, если пользователь не авторизован.В шаблоне index.html найдите заголовок, как показано во фрагменте кода ниже.

     

    Ранго говорит… привет, мир!

    Замените этот заголовок следующей разметкой и кодом шаблона Django. Обратите внимание, что мы используем объект пользователя, который доступен системе шаблонов Django через контекст. По этому объекту мы можем сказать, вошел ли пользователь в систему (аутентифицирован). Если он или она вошли в систему, мы также можем получить подробную информацию о нем или ней.

     {%, если пользователь.is_authenticated%}
    

    Ранго говорит ... привет {{user.username}}!

    {% else%}

    Ранго говорит ... привет, мир!

    {% endif%}

    Как видите, мы использовали язык шаблонов Django, чтобы проверить, аутентифицирован ли пользователь с помощью {% if user.is_authenticated%}. Переменная контекста, которую мы передаем в шаблон, будет включать пользовательскую переменную, если пользователь вошел в систему, поэтому мы можем проверить, аутентифицированы ли они или нет. В этом случае они получат персональное приветствие в заголовке, т.е.е. Ранго говорит … привет, Лейфос !. В противном случае общий Rango говорит … привет, мир! отображается заголовок.

    9.5.5. Демо

    Посмотрите на рисунок, чтобы увидеть, как все должно выглядеть.

    Рисунок 2: Снимки экрана, иллюстрирующие заголовок, который пользователи получают, когда не вошли в систему и вошли в систему под другим именем.

    После этого вход в систему должен быть завершен! Чтобы все проверить, попробуйте запустить сервер разработки Django и попытаться зарегистрировать новую учетную запись.После успешной регистрации вы сможете войти в систему, используя только что предоставленные вами данные.

    9,6. Ограничение доступа

    Теперь, когда пользователи могут входить в Rango, мы можем ограничить доступ к определенным частям приложения в соответствии со спецификацией, то есть только зарегистрированные пользователи могут добавлять категории и страницы. С помощью Django мы можем достичь этой цели двумя способами:

    • напрямую, исследуя объект запроса и проверяя, аутентифицирован ли пользователь, или
    • с использованием удобной функции декоратора , которая проверяет, аутентифицирован ли пользователь.

    Прямой подход проверяет, вошел ли пользователь в систему, с помощью метода user.is_authenticated (). Пользовательский объект доступен через объект запроса, переданный в представление. Следующий пример демонстрирует этот подход.

     def some_view (запрос):
        если не request.user.is_authenticated ():
            return HttpResponse ("Вы вошли в систему")
        еще:
            return HttpResponse («Вы не вошли в систему»)
     

    Второй подход использует декораторы Python.Декораторы названы в честь одноименного шаблона разработки программного обеспечения. Они могут динамически изменять функциональность функции, метода или класса без необходимости напрямую редактировать исходный код данной функции, метода или класса.

    Django предоставляет декоратор под названием login_required (), который мы можем прикрепить к любому представлению, в котором мы требуем, чтобы пользователь вошел в систему. Если пользователь не вошел в систему и пытается получить доступ к странице, вызывающей это представление, то пользователь является перенаправляется на другую страницу, которую вы можете настроить, обычно на страницу входа.

    9.6.1. Ограничение доступа с помощью декоратора

    Чтобы опробовать это, создайте представление в файле views.py Rango с именем limited () и добавьте следующий код:

     @login_required
    def ограничено (запрос):
        return HttpResponse ("Поскольку вы вошли в систему, вы можете видеть этот текст!")
     

    Обратите внимание, что для использования декоратора вы помещаете его непосредственно над сигнатуры функции и ставите @ перед именем декоратора. Python выполнит декоратор перед выполнением кода вашей функции / метода.ограничено / ‘, views.restricted, name =’ ограничено ‘),
    )

    Нам также потребуется обработать сценарий, в котором пользователь пытается получить доступ к ограниченному представлению (), но не вошел в систему. Что нам делать с пользователем? Самый простой подход — перенаправить его или ее браузер. Django позволяет нам указать это в файле settings.py нашего проекта, который находится в каталоге конфигурации проекта. В settings.py определите переменную LOGIN_URL с URL-адресом, на который вы хотите перенаправить пользователей, которые не вошли в систему, т.е.е. страница входа, расположенная по адресу / rango / login /:

     LOGIN_URL = '/ rango / login /'
     

    Это гарантирует, что декоратор login_required () будет перенаправлять любого пользователя, не вошедшего в систему, на URL / rango / login /.

    9,7. Выход из системы

    Чтобы пользователи могли корректно выходить из системы, было бы неплохо предоставить пользователям возможность выхода. В Django есть удобная функция logout (), которая заботится о том, чтобы пользователь вышел из системы, что его сеанс завершен, и что, если они впоследствии попытаются получить доступ к представлению, он откажет им в доступе.

    Для обеспечения возможности выхода из системы в rango / views.py добавьте представление с именем user_logout () со следующим кодом:

     из django.contrib.auth импорт выхода из системы
    
    # Используйте декоратор login_required (), чтобы гарантировать доступ к представлению только зарегистрированным пользователям.
    @login_required
    def user_logout (запрос):
        # Поскольку мы знаем, что пользователь вошел в систему, теперь мы можем просто выйти из системы.
        выйти из системы (запрос)
    
        # Верните пользователя на главную страницу.
        вернуть HttpResponseRedirect ('/ rango /')
     

    После создания представления сопоставьте URL / rango / logout / с представлением user_logout (), изменив кортеж urlpatterns в URL-адресах Rango.logout / $ ‘, views.user_logout, name =’ logout ‘),
    )

    Теперь, когда все механизмы для выхода пользователя из системы завершены, было бы удобно предоставить ссылку с домашней страницы, чтобы пользователи могли просто щелкнуть ссылку для выхода. Однако давайте подумаем: есть ли смысл предоставлять ссылку для выхода пользователю, который не вошел в систему? Возможно, нет — для пользователя, который не вошел в систему, может быть более выгодно, например, дать возможность зарегистрироваться.

    Как и в предыдущем разделе, мы изменим индекс Rango.html и используя объект пользователя в контексте шаблона, чтобы определить, какие ссылки мы хотим показывать. Найдите свой растущий список ссылок внизу страницы и замените его следующей разметкой HTML и кодом шаблона Django. Обратите внимание, что мы также добавляем ссылку на нашу страницу с ограниченным доступом в / rango / limited /.

     {% если user.is_authenticated%}
     Страница с ограниченным доступом  
    Выйти
    {% else%} Зарегистрируйтесь здесь
    Войти
    {% endif%} О программе
    Добавить новую категорию

    Простой — когда пользователь аутентифицирован и вошел в систему, он или она могут видеть ссылки на страницу с ограничениями и выход из системы.Если он или она не вошли в систему, отображаются «Зарегистрируйтесь здесь» и «Вход». Поскольку «О программе» и «Добавить новую категорию» не входят в условные блоки шаблона, эти ссылки доступны как анонимным, так и вошедшим в систему пользователям.

    9,8. Упражнения

    В этой главе рассмотрены несколько важных аспектов управления аутентификацией пользователей в Django. Мы рассмотрели основы установки приложения django.contrib.auth от Django в наш проект. Кроме того, мы также показали, как реализовать модель профиля пользователя, которая может предоставлять дополнительные поля для базового django.contrib.auth.models.Модель пользователя. Мы также подробно описали, как настроить функциональность, позволяющую регистрацию пользователей, вход в систему, выход из системы и контроль доступа. Для получения дополнительной информации об аутентификации и регистрации пользователей обратитесь к официальной документации Django по аутентификации.

    • Настройте приложение так, чтобы только зарегистрированные пользователи могли добавлять / редактировать, а незарегистрированные могли только просматривать / использовать категории / страницы. Вы также должны будете убедиться, что ссылки для добавления / редактирования страниц отображаются только в том случае, если пользователь, просматривающий веб-сайт, вошел в систему.
    • Предоставляет информативные сообщения об ошибках, когда пользователи неправильно вводят свое имя пользователя или пароль.

    В большинстве приложений вам потребуются разные уровни безопасности при регистрации и управлении пользователями — например, убедитесь, что пользователь вводит адрес электронной почты, к которому у него есть доступ, или отправляя пользователям пароли, которые они забыли. Хотя мы могли бы расширить текущий подход и построить всю необходимую инфраструктуру для поддержки такой функциональности, было разработано приложение django-registration-redux, которое значительно упрощает процесс — посетите https: // django-registration-redux.readthedocs.org, чтобы узнать больше об использовании этого пакета. Шаблоны можно найти по адресу: https://github.com/macdhuibh/django-registration-templates

    джанго-mptt-админ

    Django-mptt-admin предоставляет удобный интерфейс администратора Django для моделей django-mptt.

    Требования

    Пакет протестирован с Django (2.2 — 3.1) и django-mptt (0.11). Также с Python 3.6 — 3.8.

    Старые версии:

    • Версия 1.0.x поддерживает Django 2.0 и 2.1.
    • Версия 0.7.2 поддерживает Django 1.11 и Python 2.7.

    Установка

    Установить пакет:

      $ pip install django-mptt-admin
      

    Добавьте django_mptt_admin к установленным приложениям в settings.py .

      INSTALLED_APPS = (
          ..
          'django_mptt_admin',
      )
      

    Используйте класс DjangoMpttAdmin в admin.py:

      из django.contrib import admin
        из django_mptt_admin.admin импортировать DjangoMpttAdmin
        из страны импорта моделей
    
        класс CountryAdmin (DjangoMpttAdmin):
            проходят
    
        admin.site.register (Страна, CountryAdmin)
      

    Опции

    tree_animation_speed

    Скорость анимации открытия / закрытия в миллисекундах. По умолчанию 200 миллисекунд.

    tree_auto_open

    Автооткрывающийся узел. Значение по умолчанию — 1.

    Значения:
    * True : автоматическое открытие всех узлов
    * Ложь : не открывать автоматически
    * целое число : автоматическое открытие до этого уровня

    tree_load_on_demand

    Нагрузка по запросу (Истина / Ложь / уровень).По умолчанию True.

    • True : загрузка узлов по запросу
    • Ложь : не загружать узлы по запросу
    • int : загрузка узлов по запросу до этого уровня

    autoescape

    Autoescape (Верно / Неверно). По умолчанию True.

    Автоэскейп заголовков в дереве.

    filter_tree_queryset

    Переопределите метод filter_tree_queryset для фильтрации набора запросов для дерева.

      класс CountryAdmin (DjangoMpttAdmin):
      def filter_tree_queryset (self, queryset):
        вернуть queryset.filter (name = 'abc')
      

    use_context_menu

    Захватить событие контекстного меню. NB: событие контекстного меню запускается при щелчке правой кнопкой мыши.

    • True: зафиксировать событие контекстного меню.
    • Это полезно, если вы хотите написать собственный javascript для перехвата события tree.contextmenu .
    • См. Также https: // mbraak.github.io/jqTree/#usecontextmenu и https://mbraak.github.io/jqTree/#event-tree-contextmenu
    • False (по умолчанию): не фиксировать событие contextmenu.

    item_label_field_name

    Определите, какое поле модели должно быть меткой для элементов дерева.

    Возможные значения:
    * строка: имя поля модели или метода свойства модели для использования в качестве метки элементов дерева
    * Нет (по умолчанию): модель Unicode использовала метку элемента дерева объявлений

    Пример:

      класс MyMpttModel (MPTTModel):
        название = модели.CharField (......
    
        @свойство
        def title_for_admin (сам):
              вернуть '% s% s'% (self.pk, self.title)
    
    класс MyMpttModelAdminClass (MPTTModelAdmin):
        item_label_field_name = 'title_for_admin'
      

    Фильтры

    Если вы хотите использовать фильтры, вы можете установить опцию list_filter . См. Документацию Django.

      из django_mptt_admin.admin импорт DjangoMpttAdmin
    
    класс CountryAdmin (DjangoMpttAdmin):
        list_filter = ('континент',)
      

    Также см. Пример проекта для полного фильтра континентов.

    История изменений

    2.0.2 (27 октября 2020 г.)

    • Issue # 328: исправить DJANGO_MPTT_ADMIN_COVERAGE_JS (спасибо Andrew Kh)

    2.0.1 (26 октября 2020 г.)

    • Проблема № 309: добавить параметр для скорости анимации
    • Проблема № 325: обновление jqtree до версии 1.5.2

    2.0.0 (7 августа 2020 г.)

    1.0.2 (26 июня 2020 г.)

    • Проблема № 287: добавление переводов на каталонский и испанский (спасибо Джоан Марк Солер)

    Альтернативные интерфейсы администратора Django — подтвердите блог

    Вы используете Django (веб-фреймворк) и боитесь интерфейса администратора Django по умолчанию? Тогда есть множество альтернатив.Если вы не используете его, но ищете отличный веб-фреймворк, вам стоит взглянуть на руководство «Начало работы с Django».
    Django имеет встроенный интерфейс администратора, что действительно очень приятно. Но у нас есть и отличные альтернативы. Вот описание обеих альтернатив, которые мы недавно использовали в наших проектах.

    django-admin-bootstrapped

    django-admin-bootstrapped — это загрузочная версия интерфейса администратора для Twitter, и ее действительно просто установить.
    Вы можете найти его на github или PyPi.

    Прежде всего, установите пакет через pip:

     # Django 1.8
    pip install django-admin-bootstrapped
    
    # Django 1.7
    pip install django-admin-bootstrapped == 2.4.0
    
    # Django 1.6
    pip install django-admin-bootstrapped == 2.3.5 

    Измените свой settings.py и добавьте приложение в INSTALLED_APPS перед «django.contrib.admin»:

     INSTALLED_APPS = (
    ...
    'django_admin_bootstrapped',
    'джанго.contrib.admin ',
    ...
    )
     

    джанго-граппелли

    Grappelli — это сеточная версия интерфейса администратора, которая также очень проста в установке.
    Есть страница проекта, действительно хорошая документация, и вы также можете найти ее на github или PyPi:

    Прежде всего, установите пакет через pip:

     pip install django-grappelli 

    Измените свой settings.py и добавьте приложение в INSTALLED_APPS перед «django.contrib.admin»:

     INSTALLED_APPS = (
    .grappelli / ', включить (' grappelli.urls ')), 

    Другие альтернативы

    Конечно, есть много других альтернатив стандартному интерфейсу администратора, но в последнее время мы использовали только django-admin-bootstrapped и grappelli.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *