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. # Подключение стандартной формы для регистрации 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. |
Давайте разберём этот код, сперва мы подключаем все нужные библиотеки/компоненты, потом создаём функцию которая будет отвечать за всю логику, и в самом начале делаем массив который будет передаваться в качестве контекста.
Потом пишем условие, если есть 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. ] |
Переходим на страницу регистрации и вот что должно получится.
Всё должно работать так как надо.
Как добавить поля к регистрации:
Также иногда нужно добавлять свои поля для регистрации, для этого нужно добавить файл с формой, который будет называя «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. # Создаём форму 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`_
- 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 из
Предупреждение
Поле 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. Создание регистрации пользователя Представление и шаблон
Создав нашу инфраструктуру аутентификации, мы можем приступить к ее наращиванию, предоставив пользователям нашего приложения возможность создавать новые учетные записи пользователей.Мы добьемся этого путем создания новой комбинации представления и шаблона.
Примечание
Важно отметить, что существует несколько готовых пакетов для регистрации пользователей, которые сокращают массу хлопот по созданию собственных форм регистрации и входа в систему. Тем не менее, полезно почувствовать лежащую в основе механику, потому что использует такие приложения. Это также укрепит ваше понимание работы с формами, того, как расширить пользовательскую модель и как загружать медиа.
Чтобы предоставить возможность регистрации пользователей, мы выполним следующие шаги:
- Создайте пользовательскую форму и пользовательскую форму профиля.
- Добавьте представление для обработки создания нового пользователя.
- Создайте шаблон, отображающий UserForm и UserProfileForm.
- Сопоставьте URL-адрес созданному представлению.
- Ссылка на страницу индекса на страницу реестра
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 и добавьте следующий код:
{% endif%}Ранго Зарегистрируйтесь в Rango
{% если зарегистрировано%} Ранго говорит: Спасибо за регистрацию! Вернуться на главную страницу.
{% else%} Ранго говорит: Зарегистрируйтесь здесь!
В этом шаблоне HTML используется зарегистрированная переменная, которую мы использовали в нашем представлении, которая указывает, была ли регистрация успешной или нет. Обратите внимание, что значение registration должно быть False, чтобы шаблон отображал форму регистрации — в противном случае, помимо заголовка, отображается только сообщение об успешном завершении.
Предупреждение
Вы должны знать об атрибуте enctype для элемента
Убедитесь, что вы сопоставили атрибуты имени входа с теми, которые вы указали в представлении 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.