Как создать администратора в Django: createsuperuser
Как создать администратора в Django: createsuperuser интерактивно и без ввода, в Docker, через shell, смена пароля и выдача прав. Частые ошибки и решения.
Содержание · 9 разделов
- Интерактивное создание суперпользователя
- Создание без ввода: —noinput и переменные окружения
- Как создать суперпользователя в Docker
- Создание через shell: create_superuser()
- Как сменить пароль администратора
- Как сделать существующего пользователя администратором
- Частые ошибки
- OperationalError: no such table: auth_user
- Superuser creation skipped due to not running in a TTY
- You must use —phone with —noinput
- TypeError: create_superuser() missing 1 required positional argument: ‘username’
- Суперпользователь создан, но в админку не пускает
- Частые вопросы
- Можно ли создать несколько суперпользователей?
- Как посмотреть список администраторов?
- Можно ли узнать пароль суперпользователя?
- Как удалить суперпользователя?
- Как получить администратора в автотестах?
- Итог
Чтобы создать администратора в 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_EMAIL | Email, если не передан --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