Django-Admin.ru

Как создать администратора в Django: createsuperuser

Как создать администратора в Django: createsuperuser интерактивно и без ввода, в Docker, через shell, смена пароля и выдача прав. Частые ошибки и решения.

Редакция Django-Admin.ru
· обновлено · 8 мин чтения

Содержание · 9 разделов
  1. Интерактивное создание суперпользователя
  2. Создание без ввода: —noinput и переменные окружения
  3. Как создать суперпользователя в Docker
  4. Создание через shell: create_superuser()
  5. Как сменить пароль администратора
  6. Как сделать существующего пользователя администратором
  7. Частые ошибки
  8. OperationalError: no such table: auth_user
  9. Superuser creation skipped due to not running in a TTY
  10. You must use —phone with —noinput
  11. TypeError: create_superuser() missing 1 required positional argument: ‘username’
  12. Суперпользователь создан, но в админку не пускает
  13. Частые вопросы
  14. Можно ли создать несколько суперпользователей?
  15. Как посмотреть список администраторов?
  16. Можно ли узнать пароль суперпользователя?
  17. Как удалить суперпользователя?
  18. Как получить администратора в автотестах?
  19. Итог

Чтобы создать администратора в Django (django create admin), выполните в папке проекта python manage.py createsuperuser и ответьте на вопросы: имя пользователя, email и пароль. Команда создаёт суперпользователя — учётную запись с флагами is_staff и is_superuser, которая может войти в админку и имеет все права.

python manage.py migrate          # таблицы пользователей должны существовать
python manage.py createsuperuser

Ниже — все рабочие способы: интерактивный и неинтерактивный режимы, Docker, shell, смена пароля, повышение существующего пользователя до администратора и разбор частых ошибок. Общая настройка админки — в руководстве по Django Admin.

Интерактивное создание суперпользователя

Активируйте виртуальное окружение проекта и запустите команду из папки, где лежит manage.py:

# Windows
py manage.py createsuperuser

# macOS / Linux
python3 manage.py createsuperuser

Django по очереди спросит данные. Пароль при вводе не отображается — это нормально:

Username (leave blank to use 'arsen'): admin
Email address: admin@example.org
Password:
Password (again):
Superuser created successfully.

При LANGUAGE_CODE = "ru" на русском выводятся только названия полей — «Имя пользователя», «Адрес электронной почты»; запросы пароля и служебные сообщения команды остаются на английском. Email можно оставить пустым — у стандартной модели пользователя он необязателен.

Пароль проверяется валидаторами из AUTH_PASSWORD_VALIDATORS. На слишком простой пароль Django ответит, например, This password is too short. It must contain at least 8 characters. и спросит Bypass password validation and create user anyway? [y/N]. Для локальной разработки можно ответить y, для продакшна — придумайте нормальный пароль.

Затем запустите сервер и войдите в админку:

python manage.py runserver
# → откройте http://127.0.0.1:8000/admin/

Если проекта ещё нет, начните со статей про установку Django и создание проекта через startproject.

Создание без ввода: —noinput и переменные окружения

В CI, скриптах деплоя и контейнерах интерактивный ввод недоступен. Флаг --noinput (он же --no-input) берёт данные из аргументов и переменных окружения:

ИсточникЧто задаёт
--username, --emailПоля пользователя как аргументы команды
DJANGO_SUPERUSER_USERNAMEЛогин, если не передан --username
DJANGO_SUPERUSER_EMAILEmail, если не передан --email
DJANGO_SUPERUSER_PASSWORDПароль — только через переменную окружения

macOS / Linux:

export DJANGO_SUPERUSER_USERNAME=admin
export DJANGO_SUPERUSER_EMAIL=admin@example.org
export DJANGO_SUPERUSER_PASSWORD='длинный-случайный-пароль'
python manage.py createsuperuser --noinput
# → Superuser created successfully.

Windows (PowerShell):

$env:DJANGO_SUPERUSER_USERNAME = "admin"
$env:DJANGO_SUPERUSER_EMAIL = "admin@example.org"
$env:DJANGO_SUPERUSER_PASSWORD = "длинный-случайный-пароль"
py manage.py createsuperuser --noinput

Особенности неинтерактивного режима:

  • email обязателен. Без --email или DJANGO_SUPERUSER_EMAIL команда завершится ошибкой You must use --email with --noinput. Если email действительно не нужен, передайте пустое значение: --email "".
  • Пароль не проверяется валидаторами, поэтому ответственность за его сложность — на вас.
  • Без DJANGO_SUPERUSER_PASSWORD пользователь создаётся с непригодным паролем и войти не сможет, пока вы не зададите пароль через changepassword.
  • Повторный запуск падает с CommandError: Error: That username is already taken. и кодом выхода 1 — учитывайте это в скриптах.

Как создать суперпользователя в Docker

Если проект запущен в Docker Compose, выполните команду внутри работающего контейнера (имя сервиса — web из вашего docker-compose.yml):

docker compose exec web python manage.py createsuperuser

docker compose exec по умолчанию выделяет терминал, поэтому интерактивный ввод работает. С флагом -T или из CI-пайплайна терминала нет — тогда Django пропустит создание с сообщением Superuser creation skipped due to not running in a TTY. В таком случае используйте --noinput с переменными окружения.

Для автоматического создания при старте контейнера команда должна быть идемпотентной — повторный запуск не должен ронять entrypoint. Надёжнее проверить существование пользователя в shell:

# entrypoint.sh
python manage.py migrate --noinput
python manage.py shell -c "
import os
from django.contrib.auth import get_user_model

User = get_user_model()
username = os.environ['DJANGO_SUPERUSER_USERNAME']
if not User.objects.filter(username=username).exists():
    User.objects.create_superuser(
        username,
        os.environ.get('DJANGO_SUPERUSER_EMAIL', ''),
        os.environ['DJANGO_SUPERUSER_PASSWORD'],
    )
"

Пароль передавайте через секреты или .env, который не попадает в репозиторий. Полная схема деплоя — в статье про Gunicorn и Nginx.

Создание через shell: create_superuser()

Из консоли Django (python manage.py shell) суперпользователя создаёт метод менеджера create_superuser(). Используйте get_user_model(), чтобы код работал и со своей моделью пользователя:

from django.contrib.auth import get_user_model

User = get_user_model()
User.objects.create_superuser("admin", "admin@example.org", "длинный-случайный-пароль")

Метод сам выставит is_staff=True и is_superuser=True и захеширует пароль. Не создавайте администратора через User.objects.create(..., password="...") — пароль сохранится открытым текстом, и войти с ним не получится.

Как сменить пароль администратора

Забыли пароль — смените его без доступа к интерфейсу:

python manage.py changepassword admin

Команда дважды спросит новый пароль и проверит его валидаторами. Если имя не указать, Django возьмёт имя текущего пользователя операционной системы. Для пользователя, которого нет в базе, будет ошибка user 'admin' does not exist.

То же через shell — например, в скрипте:

from django.contrib.auth import get_user_model

user = get_user_model().objects.get(username="admin")
user.set_password("новый-пароль")
user.save()

Как сделать существующего пользователя администратором

Если пользователь уже зарегистрирован на сайте, создавать второй аккаунт не нужно — выдайте права:

# python manage.py shell
from django.contrib.auth import get_user_model

user = get_user_model().objects.get(username="ivan")
user.is_staff = True        # может входить в админку
user.is_superuser = True    # имеет все права без явного назначения
user.save()

Разница между флагами важна:

ФлагЧто даёт
is_staffВход в админку. Видны только модели, на которые выданы права
is_superuserВсе права на все модели, но для входа в админку нужен и is_staff
is_activeУчётная запись активна. При False войти нельзя вообще

Для редакторов и менеджеров обычно хватает is_staff и группы с нужными правами — полный is_superuser стоит давать только тем, кто администрирует проект. Как устроены группы и права, рассказано в статье про аутентификацию в Django. Сделать это можно и без консоли: суперпользователь отмечает галочки «Статус персонала» и «Статус суперпользователя» на странице пользователя в админке.

Частые ошибки

OperationalError: no such table: auth_user

Таблицы пользователей ещё не созданы. Примените миграции и повторите команду:

python manage.py migrate
python manage.py createsuperuser

На PostgreSQL та же ситуация выглядит как relation "auth_user" does not exist.

Superuser creation skipped due to not running in a TTY

Команда запущена без интерактивного терминала: из скрипта, CI, docker compose exec -T или из Git Bash на Windows (терминал MinTTY не сообщает Python, что ввод идёт с консоли). В Git Bash запустите команду через утилиту winpty, которая входит в Git for Windows, или откройте PowerShell либо cmd:

winpty python manage.py createsuperuser

В автоматизации используйте режим --noinput.

You must use —phone with —noinput

У вашей модели пользователя есть обязательные поля из REQUIRED_FIELDS (здесь — phone). В неинтерактивном режиме передайте каждое аргументом или переменной DJANGO_SUPERUSER_<ПОЛЕ>:

DJANGO_SUPERUSER_PASSWORD='пароль' \
python manage.py createsuperuser --noinput --email boss@example.org --phone +79990000000

Если логином служит email (USERNAME_FIELD = "email"), аргумент --username пропадает, а логин передаётся через --email или DJANGO_SUPERUSER_EMAIL.

TypeError: create_superuser() missing 1 required positional argument: ‘username’

Своя модель пользователя использует email вместо username, но менеджер остался стандартным UserManager, который ждёт username. Напишите свой менеджер:

# accounts/models.py
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models


class UserManager(BaseUserManager):
    use_in_migrations = True

    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError("Email обязателен")
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        return self.create_user(email, password, **extra_fields)


class User(AbstractUser):
    username = None
    email = models.EmailField("email", unique=True)
    phone = models.CharField("телефон", max_length=20)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["phone"]

    objects = UserManager()

Не забудьте AUTH_USER_MODEL = "accounts.User" в настройках — свою модель пользователя лучше задать до первой миграции проекта.

Суперпользователь создан, но в админку не пускает

Проверьте, что вы открываете админку того же проекта и той же базы данных (особенно при нескольких настройках или контейнерах), что is_active и is_staff равны True и что пароль задан (после --noinput без переменной пароля он непригоден). Если включены django-axes или 2FA, учётная запись может быть заблокирована или требовать код — см. статью о защите Django Admin.

Частые вопросы

Можно ли создать несколько суперпользователей?

Да. Запустите createsuperuser ещё раз с другим именем — ограничений на число суперпользователей нет. Удобнее, когда у каждого администратора своя учётная запись: в истории изменений видно, кто что правил.

Как посмотреть список администраторов?

В админке откройте «Пользователи» и включите фильтр «Статус суперпользователя». Из консоли:

from django.contrib.auth import get_user_model

User = get_user_model()
print(list(User.objects.filter(is_superuser=True).values_list("username", flat=True)))
# → ['admin']

Можно ли узнать пароль суперпользователя?

Нет. Django хранит только хеш пароля (по умолчанию PBKDF2 с SHA-256), восстановить исходный пароль из него нельзя. Задайте новый командой changepassword.

Как удалить суперпользователя?

Удалите его на странице пользователя в админке или из shell:

get_user_model().objects.get(username="admin").delete()

Вместе с пользователем удалятся записи журнала админки о его действиях. Если история нужна, отключите вход флагом is_active = False вместо удаления.

Как получить администратора в автотестах?

Создайте его в тесте и авторизуйте тестовый клиент без пароля:

from django.contrib.auth import get_user_model
from django.test import TestCase


class AdminPagesTests(TestCase):
    def test_admin_index(self):
        admin_user = get_user_model().objects.create_superuser(
            "admin", "admin@example.org", "test-pass"
        )
        self.client.force_login(admin_user)
        response = self.client.get("/admin/")
        self.assertEqual(response.status_code, 200)

Итог

Для локальной разработки достаточно python manage.py createsuperuser, для Docker и CI — --noinput с переменными DJANGO_SUPERUSER_* или идемпотентный скрипт с create_superuser(). Пароль меняется командой changepassword, а существующему пользователю права выдаются флагами is_staff и is_superuser. Дальше настройте админку по полному руководству — все статьи кластера собраны в разделе Django Admin.

  • #Django
  • #createsuperuser
  • #Django Admin
  • #Суперпользователь
  • #Docker
↑ ↓ выборEnter открытьEsc закрыть