django-hero-gen 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,125 +1,229 @@
1
- # 🦸‍♂️ Django Hero Gen (v1.1.11)
1
+ > **⚠️ ДИСКЛЕЙМЕР:** Данный инструмент и руководство созданы исключительно в образовательных целях. Настоятельно рекомендуется использовать этот CLI-инструмент как средство для **подготовки к экзамену**, автоматизации рутины и изучения структуры Django, а не как способ для списывания. Понимание того, как работает сгенерированный код — залог успешной защиты!
2
2
 
3
- **Django Hero Gen**это мощный CLI-инструмент для мгновенного развертывания фронтенда и базовой логики Django-приложений. Забудь о рутинном написании кода авторизации, создании моделей и копировании Bootstrap-шаблонов. Делай это одной командой.
3
+ # 🦸‍♂️ Django Hero Gen (v1.3.0) Demo Edition
4
4
 
5
- ---
5
+ **Django Hero Gen** — это CLI-инструмент для молниеносного развертывания Django-проектов. Текущая версия полностью адаптирована под **PostgreSQL**, **Crispy Forms** и **локальную работу** (без интернета).
6
6
 
7
7
  ## 🚀 Быстрый старт
8
8
 
9
9
  ### Установка
10
10
 
11
- Установите пакет глобально, чтобы использовать команду `dj-gen` в любом месте:
11
+ Глобальная установка (рекомендуется):
12
12
 
13
13
  ```bash
14
14
  npm install -g django-hero-gen
15
15
 
16
16
  ```
17
17
 
18
- Или используйте через `npx` без установки:
18
+ Запуск через `npx`:
19
19
 
20
20
  ```bash
21
21
  npx django-hero-gen <команда>
22
22
 
23
23
  ```
24
24
 
25
- ### Полная инициализация
25
+ ---
26
+
27
+ ## 🎓 Гайд: Как написать демо-проект с нуля
28
+
29
+ ### Шаг 1: Подготовка папки
26
30
 
27
- Создает основной набор файлов для быстрого старта (шаблоны + вьюхи + админка):
31
+ 1. На рабочем столе создай папку с названием `demo`.
32
+ 2. Нажми на неё правой кнопкой мыши и выбери **«Открыть с помощью Code»** (VS Code).
33
+ 3. В VS Code нажми `Ctrl + ~` (тильда), чтобы открыть терминал.
34
+
35
+ ### Шаг 2: Настройка окружения
36
+
37
+ Скопируй и вставь эти команды в терминал по очереди:
38
+
39
+ 1. **Создаем виртуальное окружение:**
28
40
 
29
41
  ```bash
30
- dj-gen init
42
+ python -m venv venv
31
43
 
32
44
  ```
33
45
 
34
- ---
46
+ 2. **Активируем его:**
35
47
 
36
- ## 🛠 Доступные команды
48
+ ```bash
49
+ venv\Scripts\activate
37
50
 
38
- ### 1. Шаблоны HTML (Bootstrap 5)
51
+ ```
39
52
 
40
- Команды для создания фронтенд-части. Запускать в папке `templates`.
53
+ _(Слева от строки ввода должно появиться `(venv)`. Это значит — всё ок!)_ 3. **Устанавливаем библиотеки:**
41
54
 
42
- | Команда | Файл | Описание |
43
- | -------------------------- | -------------------- | ----------------------------------------------- |
44
- | `dj-gen base` | `base.html` | Каркас: Navbar, Footer, блоки контента. |
45
- | `dj-gen home` | `home.html` | Главная: Слайдер (Carousel) и описание сервиса. |
46
- | `dj-gen course_page` | `create_course.html` | Страница с формой создания объектов. |
47
- | `dj-gen my_course` | `my_course.html` | Список карточек с модальными окнами. |
48
- | `dj-gen login_page` | `login.html` | Готовая страница входа. |
49
- | `dj-gen registration_page` | `registration.html` | Страница регистрации пользователей. |
55
+ ```bash
56
+ pip install django psycopg2 django-crispy-forms crispy-bootstrap5
50
57
 
51
- ### 2. Логика Python (Django)
58
+ ```
52
59
 
53
- Команды для генерации серверной части. Запускать в папке приложения.
60
+ ### Шаг 3: Настройка базы данных (Слоник)
54
61
 
55
- **Вьюхи и Админка:**
62
+ 1. Запусти **pgAdmin 4** (синий слоник) на рабочем столе.
63
+ 2. Нажми правой кнопкой на `Databases` -> `Create` -> `Database...`.
64
+ 3. В поле `Database` напиши название: **`db_demo`**.
65
+ 4. Нажми `Save`. На этом работа в pgAdmin закончена.
56
66
 
57
- - `dj-gen auth_view` Создает `views.py` (Авторизация, Регистрация, Cookies).
58
- - `dj-gen orders_view` — Создает `order_views.py` (Бизнес-логика заказов/курсов).
59
- - `dj-gen admin` — Стандартный `admin.py` для регистрации моделей.
67
+ ### Шаг 4: Создание структуры проекта
60
68
 
61
- **Модели и Формы:**
69
+ В терминале VS Code:
70
+
71
+ 1. **Создаем проект:** `django-admin startproject project .` (точка в конце важна!).
72
+ 2. **Создаем приложения:**
73
+
74
+ ```bash
75
+ python manage.py startapp accounts
76
+ python manage.py startapp orders
62
77
 
63
- - `dj-gen modelsUser` — `models.py` с кастомным пользователем (AbstractUser).
64
- - `dj-gen modelsOrders` — `models.py` с моделью заявок/курсов.
65
- - `dj-gen userForm` — `forms.py` для регистрации и профиля.
66
- - `dj-gen orderForm` — `forms.py` для создания заявок.
78
+ ```
67
79
 
68
- **Настройки и Маршруты:**
80
+ 3. **Создаем папки для дизайна:** `mkdir static templates`.
69
81
 
70
- - `dj-gen settings` Готовый блок настроек для `settings.py`.
71
- - `dj-gen authUrls` — `urls.py` для логики аккаунтов.
72
- - `dj-gen ordersUrls` — `urls.py` для логики заказов.
82
+ - _Важно:_ скопируй файлы `bootstrap.min.css` и `bootstrap.bundle.min.js` из папки Bootstrap на рабочем столе в свою новую папку `static`.
73
83
 
74
84
  ---
75
85
 
76
- ## 📁 Структура после развертывания
86
+ ## Наполнение кодом (Используем CLI)
87
+
88
+ 1. **В корневой папке (`demo/`):**
89
+
90
+ - `dj-gen settings` — скопируй вывод в `project/settings.py`. Укажи свой пароль от Postgres.
91
+
92
+ 2. **В папке `accounts/`:**
93
+
94
+ - `dj-gen modelUser`, `dj-gen auth_view`, `dj-gen userForm`, `dj-gen authUrls`
95
+
96
+ 3. **В папке `orders/`:**
97
+
98
+ - `dj-gen modelOrders`, `dj-gen orders_view`, `dj-gen orderForm`, `dj-gen ordersUrls`
99
+
100
+ 4. **В папке `templates/`:**
101
+
102
+ - `dj-gen base`, `dj-gen home`
103
+
104
+ 5. **В папке `templates/auth/` (создай её):**
105
+
106
+ - `dj-gen login_page`, `dj-gen registration_page`
107
+
108
+ 6. **В папке `templates/orders/` (создай её):**
109
+
110
+ - `dj-gen course_page` (создаст `create_course.html`)
111
+ - `dj-gen my_course` (создаст `my_course.html`)
112
+
113
+ **Финальный штрих (Миграции):**
114
+
115
+ ```bash
116
+ python manage.py makemigrations
117
+ python manage.py migrate
118
+ python manage.py runserver
119
+
120
+ ```
121
+
122
+ ---
77
123
 
78
- При использовании `dj-gen init` в папке вашего приложения:
124
+ ## 📁 Примерная структура проекта может отличаться
79
125
 
80
126
  ```text
81
- your_app/
82
- ├─ templates/
83
- │ ├─ base.html # Базовый шаблон
84
- ├─ home.html # Главная страница
85
- ├─ login.html # Вход
86
- │ ├─ registration.html # Регистрация
87
- │ ├─ create_course.html # Форма создания
88
- │ └─ my_course.html # Список объектов
89
- ├─ views.py # Логика Auth
90
- ├─ order_views.py # Логика Orders
91
- ├─ models.py # Модели
92
- ├─ forms.py # Формы
93
- ├─ urls.py # Маршруты
94
- └─ admin.py # Админка
127
+ demo/
128
+ ├── venv/ # Окружение
129
+ ├── static/ # Сюда положи Bootstrap!
130
+ ├── css/bootstrap.min.css
131
+ └── js/bootstrap.bundle.min.js
132
+ ├── templates/ # HTML шаблоны
133
+ ├── accounts/ # Логика пользователей
134
+ ├── orders/ # Логика заданий
135
+ ├── project/ # Настройки
136
+ └── manage.py
95
137
 
96
138
  ```
97
139
 
98
140
  ---
99
141
 
100
- ## ⚙️ Важные настройки
142
+ ## 🐘 Лайфхак для схем
101
143
 
102
- Для работы сгенерированного кода убедитесь, что в вашем окружении установлены:
144
+ Если на экзамене нужна **ER-диаграмма**:
103
145
 
104
- 1. **Python зависимости:**
146
+ 1. В **pgAdmin** нажми правой кнопкой на базу `db_demo`.
147
+ 2. Выбери **ERD Tool**.
148
+ 3. Программа сама нарисует связи. Сделай скриншот для отчета!
105
149
 
106
- ```bash
107
- pip install django-bootstrap5 django-phonenumber-field
150
+ ---
108
151
 
109
- ```
152
+ ## 🛠 Все доступные команды
153
+
154
+ ### 1. HTML-шаблоны (Bootstrap 5)
155
+
156
+ > Запускать **в папке `templates/`**
157
+
158
+ | Команда | Файл | Описание |
159
+ | -------------------------- | -------------------- | --------------------------------------------- |
160
+ | `dj-gen base` | `base.html` | Базовый шаблон: Navbar, Footer, `{% block %}` |
161
+ | `dj-gen home` | `home.html` | Главная страница с Carousel и описанием |
162
+ | `dj-gen course_page` | `create_course.html` | Страница создания курса / заявки |
163
+ | `dj-gen my_course` | `my_course.html` | Список курсов / заявок с модальными окнами |
164
+ | `dj-gen login_page` | `login.html` | Страница входа |
165
+ | `dj-gen registration_page` | `registration.html` | Страница регистрации |
166
+
167
+ ---
168
+
169
+ ### 2. Django-логика (Python)
170
+
171
+ > Запускать **в папке приложения**
110
172
 
111
- 2. **В settings.py:**
173
+ #### 📌 Views и Admin
112
174
 
113
- - Добавьте `'bootstrap5'` и `'phonenumber_field'` в `INSTALLED_APPS`.
114
- - Укажите `AUTH_USER_MODEL = 'имя_вашего_приложения.CustomUser'`.
115
- - Проверьте пути в `TEMPLATES` и `STATICFILES_DIRS`.
175
+ - `dj-gen auth_view`
176
+ `views.py`
177
+ Авторизация, регистрация, cookies, login / logout
178
+
179
+ - `dj-gen orders_view`
180
+ ➜ `order_views.py`
181
+ CRUD-логика курсов / заявок
182
+
183
+ - `dj-gen admin`
184
+ ➜ `admin.py`
185
+ Регистрация моделей в админке
186
+
187
+ ---
188
+
189
+ #### 📌 Модели
190
+
191
+ - `dj-gen modelUser`
192
+ ➜ `models.py`
193
+ Кастомный пользователь (`AbstractUser`)
194
+
195
+ - `dj-gen modelOrders`
196
+ ➜ `models.py`
197
+ Модель курсов / заявок
116
198
 
117
199
  ---
118
200
 
119
- ## 📜 Лицензия
201
+ #### 📌 Формы
120
202
 
121
- Лицензия **MIT**. Автор: **asappaholik**.
203
+ - `dj-gen userForm`
204
+ ➜ `forms.py`
205
+ Форма регистрации и профиля пользователя
122
206
 
123
- **Удачной разработки и успешных экзаменов!**
207
+ - `dj-gen orderForm`
208
+ ➜ `forms.py`
209
+ Форма создания заявки / курса
124
210
 
125
211
  ---
212
+
213
+ #### 📌 URLs
214
+
215
+ - `dj-gen authUrls`
216
+ ➜ `urls.py`
217
+ Маршруты аутентификации
218
+
219
+ - `dj-gen ordersUrls`
220
+ ➜ `urls.py`
221
+ Маршруты курсов / заявок
222
+
223
+ ---
224
+
225
+ ## 📜 Лицензия и Автор
226
+
227
+ **MIT License** | Автор: **[https://t.me/asapaholik](https://t.me/asapaholik)**
228
+
229
+ 🔥 **Удачи! Ты справишься!**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "django-hero-gen",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Генератор шаблонов для Django",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -0,0 +1,10 @@
1
+ module.exports = () => `
2
+ from django.contrib import admin
3
+ from .models import Orders
4
+
5
+ @admin.register(Orders)
6
+ class OrdersAdmin(admin.ModelAdmin):
7
+ list_display = ('user', 'course', 'date', 'payment', 'status')
8
+ list_filter = ('status', 'payment', 'course')
9
+
10
+ `;
package/src/commands.js CHANGED
@@ -16,6 +16,7 @@ const userFormTpl = require("./forms/user_form");
16
16
  const orderFormTpl = require("./forms/order_form");
17
17
  const loginPageTpl = require("./templates/login");
18
18
  const registrationPageTpl = require("./templates/registration");
19
+ const adminTpl = require("./admin/admin");
19
20
 
20
21
  const saveFile = (fileName, content) => {
21
22
  const filePath = path.join(process.cwd(), fileName);
@@ -35,10 +36,7 @@ const makeAll = () => {
35
36
  saveFile("my_course.html", myCourseTpl());
36
37
  saveFile("views.py", authViewsTpl());
37
38
  saveFile("order_views.py", orderViewsTpl());
38
- saveFile(
39
- "admin.py",
40
- `from django.contrib import admin\n\n# Register your models here.`,
41
- );
39
+ saveFile("admin.py", adminTpl());
42
40
  console.log("✨ Готово! Не забудь настроить urls.py.");
43
41
  };
44
42
 
@@ -48,7 +46,7 @@ module.exports = {
48
46
  makeCreatePage: () => saveFile("create_course.html", createCourseTpl()),
49
47
  makeListPage: () => saveFile("my_course.html", myCourseTpl()),
50
48
  makeAuth: () => saveFile("views.py", authViewsTpl()),
51
- makeOrders: () => saveFile("order_views.py", orderViewsTpl()),
49
+ makeOrders: () => saveFile("views.py", orderViewsTpl()),
52
50
  makeModelOrders: () => saveFile("models.py", modelOrdersTpl()),
53
51
  makeModelUser: () => saveFile("models.py", modelUserTpl()),
54
52
  makeSettings: () => saveFile("settings.py", coreSettingsTpl()),
@@ -57,12 +55,9 @@ module.exports = {
57
55
  makeUserForm: () => saveFile("forms.py", userFormTpl()),
58
56
  makeOrderForm: () => saveFile("forms.py", orderFormTpl()),
59
57
  makeLoginPage: () => saveFile("login.html", loginPageTpl()),
58
+ makeAdmin: () => saveFile("admin.py", adminTpl()),
60
59
  makeRegistrationPage: () =>
61
60
  saveFile("registration.html", registrationPageTpl()),
62
- makeAdmin: () =>
63
- saveFile(
64
- "admin.py",
65
- `from django.contrib import admin\n\n# Register your models here.`,
66
- ),
61
+
67
62
  initFull: makeAll,
68
63
  };
@@ -2,26 +2,15 @@ module.exports = () => `
2
2
  # Модель базы данных авторизации
3
3
  from django.db import models
4
4
  from django.contrib.auth.models import AbstractUser
5
- from phonenumber_field.modelfields import PhoneNumberField
6
- from django.core.validators import RegexValidator
5
+
7
6
 
8
7
  class CustomUser(AbstractUser):
9
8
 
10
- login_validator = RegexValidator(
11
- regex=r'^[a-zA-Z0-9]{6,}$',
12
- message='(латиница и цифры, не менее 6 символов)'
13
- )
14
-
15
- full_name_validator = RegexValidator(
16
- regex=r'^[а-яА-ЯёЁ\s]+$',
17
- message='(символы кириллицы и пробелы)'
18
- )
19
-
20
9
  username = models.CharField(
21
10
  unique=True,
22
11
  max_length=120,
23
12
  verbose_name='Логин',
24
- validators=[login_validator]
13
+
25
14
  )
26
15
 
27
16
 
@@ -34,9 +23,11 @@ class CustomUser(AbstractUser):
34
23
  full_name = models.CharField(
35
24
  max_length=120,
36
25
  verbose_name='ФИО',
37
- validators=[full_name_validator]
38
26
  )
39
27
 
40
- phone = PhoneNumberField(region='RU', verbose_name='Номер телефона')
28
+ phone = models.CharField(
29
+ max_length=20,
30
+ verbose_name='Номер телефона'
31
+ )
41
32
 
42
33
  `;
@@ -2,7 +2,7 @@ module.exports = () => `
2
2
  """
3
3
  Django settings for project project.
4
4
 
5
- Generated by 'django-admin startproject' using Django 4.2.24.
5
+ Generated by 'django-admin startproject' using Django 4.2.27.
6
6
 
7
7
  For more information on this file, see
8
8
  https://docs.djangoproject.com/en/4.2/topics/settings/
@@ -21,7 +21,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
21
21
  # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
22
22
 
23
23
  # SECURITY WARNING: keep the secret key used in production secret!
24
- SECRET_KEY = 'django-insecure-rokcncxrv9se5e=ma8#vlb9gds&^-ayvj1e1d&!v8fnb*f@a59'
24
+ SECRET_KEY = 'django-insecure-=n27(^4l^ake6@5y2*s9*j%tw&!o9vi%z7e4_2w6bmm737k!87'
25
25
 
26
26
  # SECURITY WARNING: don't run with debug turned on in production!
27
27
  DEBUG = True
@@ -40,9 +40,8 @@ INSTALLED_APPS = [
40
40
  'django.contrib.staticfiles',
41
41
  'accounts',
42
42
  'orders',
43
- 'bootstrap5',
44
- 'phonenumber_field',
45
-
43
+ 'crispy_forms',
44
+ 'crispy_bootstrap5',
46
45
  ]
47
46
 
48
47
  MIDDLEWARE = [
@@ -81,8 +80,13 @@ WSGI_APPLICATION = 'project.wsgi.application'
81
80
 
82
81
  DATABASES = {
83
82
  'default': {
84
- 'ENGINE': 'django.db.backends.sqlite3',
85
- 'NAME': BASE_DIR / 'db.sqlite3',
83
+ 'ENGINE': 'django.db.backends.postgresql',
84
+ 'NAME':'demo2',
85
+ 'USER':'postgres',
86
+ 'PASSWORD':'0405',
87
+ 'HOST':'localhost',
88
+ 'PORT':'5432',
89
+
86
90
  }
87
91
  }
88
92
 
@@ -122,15 +126,15 @@ USE_TZ = True
122
126
  # https://docs.djangoproject.com/en/4.2/howto/static-files/
123
127
 
124
128
  STATIC_URL = 'static/'
125
-
126
129
  STATICFILES_DIRS = [
127
- BASE_DIR / "static",
130
+ BASE_DIR / 'static',
128
131
  ]
129
-
130
132
  # Default primary key field type
131
133
  # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
132
134
 
133
135
  DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
134
-
135
136
  AUTH_USER_MODEL = 'accounts.CustomUser'
137
+
138
+ CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
139
+ CRISPY_TEMPLATE_PACK = "bootstrap5"
136
140
  `;
@@ -1,4 +1,7 @@
1
- module.exports = () => `{% load bootstrap5 %} {% load static %}
1
+ module.exports = () => `
2
+ {% load static %}
3
+ {% load crispy_forms_tags %}
4
+
2
5
  <!DOCTYPE html>
3
6
  <html lang="en">
4
7
  <head>
@@ -1,6 +1,6 @@
1
1
  module.exports = () => `
2
2
  {% extends "base.html" %}
3
- {% load bootstrap5 %}
3
+ {% load crispy_forms_tags %}
4
4
 
5
5
 
6
6
  {% block content %}
@@ -11,7 +11,7 @@ module.exports = () => `
11
11
 
12
12
  <form method="post">
13
13
  {% csrf_token %}
14
- {% bootstrap_form form %}
14
+ {% crispy form %}
15
15
  <button type="submit" class="btn btn-primary">Отправить заявку</button>
16
16
  </form>
17
17
 
@@ -1,5 +1,6 @@
1
1
  module.exports = () => `{% extends "base.html" %}
2
- {% load bootstrap5 %}{% load static %}
2
+ {% load crispy_forms_tags %}
3
+ {% load static %}
3
4
  {% block content %}
4
5
  <style>
5
6
  .carousel-control-prev-icon,
@@ -19,7 +20,6 @@ module.exports = () => `{% extends "base.html" %}
19
20
  height: 250px;
20
21
  }
21
22
  </style>
22
- {% bootstrap_css %} {% bootstrap_javascript %}
23
23
 
24
24
  <div id="carouselExampleAutoplaying" class="carousel slide py-5 mb-5" data-bs-ride="carousel" data-bs-interval="400">
25
25
  <div class="carousel-inner">
@@ -1,10 +1,11 @@
1
- module.exports = () => ` {% extends 'base.html' %} {% load bootstrap5 %} {%
1
+ module.exports =
2
+ () => ` {% extends 'base.html' %} {% load crispy_forms_tags %} {%
2
3
  block content %}
3
4
 
4
5
  <div class="container">
5
6
  <form method="post">
6
- {% csrf_token %} {% bootstrap_form form %}
7
- <button class="btn-primary">Войти</button>
7
+ {% csrf_token %} {% crispy form %}
8
+ <button class="btn btn-primary">Войти</button>
8
9
  </form>
9
10
  <div><a href="{% url 'registration' %}"></a></div>
10
11
  </div>
@@ -1,6 +1,6 @@
1
1
  module.exports = () => `
2
2
  {% extends "base.html" %}
3
- {% load bootstrap5 %}
3
+ {% load crispy_forms_tags %}
4
4
 
5
5
  {% block content %}
6
6
  <div class="container my-5">
@@ -1,10 +1,11 @@
1
- module.exports = () => ` {% extends 'base.html' %} {% load bootstrap5 %} {%
1
+ module.exports =
2
+ () => ` {% extends 'base.html' %} {% load crispy_forms_tags %} {%
2
3
  block content %}
3
4
 
4
5
  <div class="container">
5
6
  <form method="post">
6
- {% csrf_token %} {% bootstrap_form form %}
7
- <button class="btn-primary">Зарегистрироваться</button>
7
+ {% csrf_token %} {% crispy form %}
8
+ <button class="btn btn-primary">Зарегистрироваться</button>
8
9
  </form>
9
10
  <div><a href="{% url 'login' %}"></a></div>
10
11
  </div>