django-hero-gen 1.1.0 → 1.1.2
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 +119 -0
- package/index.js +2 -0
- package/package.json +1 -1
- package/src/commands.js +4 -0
- package/src/model/order_model.js +38 -0
- package/src/model/user_model.js +42 -0
- package/src/templates/my_course.js +54 -45
package/README.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 🦸♂️ Django Hero Gen
|
|
2
|
+
|
|
3
|
+
**Django Hero Gen** — это мощный CLI-инструмент для мгновенного развертывания фронтенда и базовой логики Django-приложений. Больше не нужно вручную копировать Bootstrap-шаблоны, настраивать Navbar или переписывать стандартные View для авторизации. Сделайте это одной командой и сэкономьте часы рутины.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚀 Быстрый старт
|
|
8
|
+
|
|
9
|
+
### Установка
|
|
10
|
+
|
|
11
|
+
Установите пакет глобально, чтобы команда `dj-gen` была доступна в любом месте:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g django-hero-gen
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Или используйте без установки через `npx`:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx django-hero-gen <команда>
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Полная инициализация проекта
|
|
26
|
+
|
|
27
|
+
Самый быстрый способ наполнить новое Django-приложение контентом. Создает все необходимые файлы одним махом:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
dj-gen init
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> **Что будет создано:** `base.html`, `home.html`, `create_course.html`, `my_course.html`, `views.py`, `order_views.py`, `admin.py`.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 🛠 Доступные команды
|
|
39
|
+
|
|
40
|
+
### 1. Генерация шаблонов (HTML + Bootstrap 5)
|
|
41
|
+
|
|
42
|
+
Все шаблоны поддерживают наследование и адаптированы под мобильные устройства.
|
|
43
|
+
|
|
44
|
+
| Команда | Файл | Описание |
|
|
45
|
+
| ------------- | -------------------- | ----------------------------------------------------------------------------------------------- |
|
|
46
|
+
| `dj-gen base` | `base.html` | **Фундамент:** Navbar с логикой Auth, Footer, системные уведомления и подключенный Bootstrap 5. |
|
|
47
|
+
| `dj-gen home` | `home.html` | **Главная:** Слайдер (Carousel) с поддержкой static и информационный блок. |
|
|
48
|
+
| `dj-gen form` | `create_course.html` | **Формы:** Готовая разметка для рендеринга Django-форм через Bootstrap. |
|
|
49
|
+
| `dj-gen list` | `my_course.html` | **Личный кабинет:** Список карточек с индикаторами статуса и встроенными модальными окнами. |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### 2. Генерация логики (Python)
|
|
54
|
+
|
|
55
|
+
Готовые обработчики для типовых задач Django.
|
|
56
|
+
|
|
57
|
+
- **`dj-gen auth`** — Создает `views.py`. Включает:
|
|
58
|
+
- `registration_view` (с использованием CustomUserCreationForm).
|
|
59
|
+
- `login_view` и `logout_view`.
|
|
60
|
+
- `accept_cookies` (обработка согласия пользователя через Cookies).
|
|
61
|
+
|
|
62
|
+
- **`dj-gen orders`** — Создает `order_views.py`. Чистый файл для вашей бизнес-логики заказов или курсов.
|
|
63
|
+
- **`dj-gen admin`** — Создает `admin.py`. Базовый импорт и место для регистрации ваших моделей.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 📁 Структура создаваемых файлов
|
|
68
|
+
|
|
69
|
+
После выполнения команды `dj-gen init` структура вашего приложения примет следующий вид:
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
your_app/
|
|
73
|
+
├─ templates/
|
|
74
|
+
│ ├─ base.html # Базовый скелет сайта
|
|
75
|
+
│ ├─ home.html # Главная страница (extends base.html)
|
|
76
|
+
│ ├─ create_course.html # Страница создания (extends base.html)
|
|
77
|
+
│ └─ my_course.html # Список объектов (extends base.html)
|
|
78
|
+
├─ views.py # Логика пользователей и аутентификации
|
|
79
|
+
├─ order_views.py # Логика обработки бизнес-задач
|
|
80
|
+
└─ admin.py # Регистрация моделей в панели управления
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## ⚙️ Важные настройки после генерации
|
|
87
|
+
|
|
88
|
+
Для корректной работы созданных файлов выполните следующие шаги:
|
|
89
|
+
|
|
90
|
+
1. **Настройка путей:** Убедитесь, что в `settings.py` в секции `TEMPLATES` указана папка с вашими шаблонами.
|
|
91
|
+
2. **Зависимости:** Установите библиотеку для работы с формами:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install django-bootstrap5
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
И добавьте `'django_bootstrap5'` в `INSTALLED_APPS`. 3. **Маршрутизация:** Подключите созданные функции в вашем `urls.py`:
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
from . import views, order_views
|
|
102
|
+
|
|
103
|
+
urlpatterns = [
|
|
104
|
+
path('', views.home_view, name='home'),
|
|
105
|
+
path('login/', views.login_view, name='login'),
|
|
106
|
+
# и так далее...
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 📜 Лицензия
|
|
114
|
+
|
|
115
|
+
Распространяется под лицензией **MIT**. Свободно для использования в коммерческих и личных проектах.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
**Удачной разработки!**
|
package/index.js
CHANGED
|
@@ -15,6 +15,8 @@ const actions = {
|
|
|
15
15
|
auth: cmds.makeAuth, // вьюхи логина/регистрации
|
|
16
16
|
orders: cmds.makeOrders, // Теперь эта команда будет работать
|
|
17
17
|
admin: cmds.makeAdmin,
|
|
18
|
+
modelsOrders: cmds.makeModelOrders,
|
|
19
|
+
modelsUser: cmds.makeModelUser,
|
|
18
20
|
|
|
19
21
|
// Полная сборка
|
|
20
22
|
init: cmds.initFull,
|
package/package.json
CHANGED
package/src/commands.js
CHANGED
|
@@ -7,6 +7,8 @@ const createCourseTpl = require("./templates/create_course");
|
|
|
7
7
|
const myCourseTpl = require("./templates/my_course");
|
|
8
8
|
const authViewsTpl = require("./view/auth_view");
|
|
9
9
|
const orderViewsTpl = require("./view/order_view");
|
|
10
|
+
const modelOrdersTpl = require("./model/orders_model");
|
|
11
|
+
const modelUserTpl = require("./model/user_model");
|
|
10
12
|
|
|
11
13
|
const saveFile = (fileName, content) => {
|
|
12
14
|
const filePath = path.join(process.cwd(), fileName);
|
|
@@ -40,6 +42,8 @@ module.exports = {
|
|
|
40
42
|
makeListPage: () => saveFile("my_course.html", myCourseTpl()),
|
|
41
43
|
makeAuth: () => saveFile("views.py", authViewsTpl()),
|
|
42
44
|
makeOrders: () => saveFile("order_views.py", orderViewsTpl()),
|
|
45
|
+
makeModelOrders: () => saveFile("models.py", modelOrdersTpl()),
|
|
46
|
+
makeModelUser: () => saveFile("models.py", modelUserTpl()),
|
|
43
47
|
makeAdmin: () =>
|
|
44
48
|
saveFile(
|
|
45
49
|
"admin.py",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module.exports = () => `
|
|
2
|
+
from django.db import models
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
# Create your models here.
|
|
5
|
+
class Orders(models.Model):
|
|
6
|
+
|
|
7
|
+
COURSE = [
|
|
8
|
+
|
|
9
|
+
('algo','АЛгоритмы'),
|
|
10
|
+
('design','Дизайн'),
|
|
11
|
+
('bd','БАЗЫ ДАННЫХ'),
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
STATUS = [
|
|
16
|
+
('new','новая'),
|
|
17
|
+
('in_progress','в процессе выполнения'),
|
|
18
|
+
('completed','завершено'),
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
PAYMENT = [
|
|
23
|
+
('cash','наличкой'),
|
|
24
|
+
('on_phone','по номеру телефона'),
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
|
|
29
|
+
|
|
30
|
+
course = models.CharField(max_length=120,choices=COURSE,verbose_name='Выберите курс')
|
|
31
|
+
payment = models.CharField(max_length=120,choices=PAYMENT,verbose_name='Выберите способ оплаты')
|
|
32
|
+
|
|
33
|
+
status = models.CharField(max_length=120,default='new',choices=STATUS)
|
|
34
|
+
|
|
35
|
+
date = models.DateField('дата')
|
|
36
|
+
|
|
37
|
+
review = models.TextField(blank=True)
|
|
38
|
+
`;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module.exports = () => `
|
|
2
|
+
# Модель базы данных авторизации
|
|
3
|
+
from django.db import models
|
|
4
|
+
from django.contrib.auth.models import AbstractUser
|
|
5
|
+
from django_cryptography.fields import encrypt
|
|
6
|
+
from phonenumber_field.modelfields import PhoneNumberField
|
|
7
|
+
from django.core.validators import RegexValidator
|
|
8
|
+
|
|
9
|
+
class CustomUser(AbstractUser):
|
|
10
|
+
|
|
11
|
+
login_validator = RegexValidator(
|
|
12
|
+
regex=r'^[a-zA-Z0-9]{6,}$',
|
|
13
|
+
message='(латиница и цифры, не менее 6 символов)'
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
full_name_validator = RegexValidator(
|
|
17
|
+
regex=r'^[а-яА-ЯёЁ\s]+$',
|
|
18
|
+
message='(символы кириллицы и пробелы)'
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
username = models.CharField(
|
|
22
|
+
unique=True,
|
|
23
|
+
max_length=120,
|
|
24
|
+
verbose_name='Логин',
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
email = models.EmailField(
|
|
29
|
+
unique=True,
|
|
30
|
+
max_length=120,
|
|
31
|
+
verbose_name='Почта'
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
full_name = models.CharField(
|
|
35
|
+
max_length=120,
|
|
36
|
+
verbose_name='ФИО',
|
|
37
|
+
validators=[full_name_validator]
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
phone = PhoneNumberField(region='RU')
|
|
41
|
+
|
|
42
|
+
`;
|
|
@@ -1,26 +1,41 @@
|
|
|
1
1
|
module.exports = () => `
|
|
2
|
-
{% extends "base.html" %}
|
|
2
|
+
{% extends "base.html" %}
|
|
3
|
+
{% load bootstrap5 %}
|
|
4
|
+
|
|
5
|
+
{% block content %}
|
|
3
6
|
<div class="container my-5">
|
|
4
7
|
<div class="row">
|
|
8
|
+
|
|
5
9
|
{% for order in course %}
|
|
6
10
|
<div class="col-md-6 col-lg-4 mb-4">
|
|
7
|
-
<div class="card h-100">
|
|
11
|
+
<div class="card h-100 shadow-sm">
|
|
12
|
+
|
|
8
13
|
<div class="card-header">
|
|
9
|
-
<h5 class="
|
|
14
|
+
<h5 class="mb-0">{{ order.get_course_display }}</h5>
|
|
10
15
|
</div>
|
|
16
|
+
|
|
11
17
|
<div class="card-body">
|
|
12
|
-
<p class="text-muted"
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
<p class="text-muted">
|
|
19
|
+
<small>Дата начала: {{ order.date }}</small>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
{% if order.review %}
|
|
23
|
+
<p>
|
|
24
|
+
<strong>Ваш отзыв:</strong><br>
|
|
25
|
+
{{ order.review }}
|
|
26
|
+
</p>
|
|
15
27
|
{% endif %}
|
|
16
28
|
</div>
|
|
17
|
-
<div class="card-footer">
|
|
18
|
-
<span class="badge bg-secondary">{{ order.get_status_display }}</span>
|
|
19
29
|
|
|
20
|
-
|
|
30
|
+
<div class="card-footer d-flex justify-content-between align-items-center">
|
|
31
|
+
<span class="badge bg-secondary">
|
|
32
|
+
{{ order.get_status_display }}
|
|
33
|
+
</span>
|
|
34
|
+
|
|
35
|
+
{% if order.status == 'completed' and not order.review %}
|
|
21
36
|
<button
|
|
22
37
|
type="button"
|
|
23
|
-
class="btn btn-sm btn-outline-primary
|
|
38
|
+
class="btn btn-sm btn-outline-primary"
|
|
24
39
|
data-bs-toggle="modal"
|
|
25
40
|
data-bs-target="#reviewModal{{ order.id }}"
|
|
26
41
|
>
|
|
@@ -31,67 +46,61 @@ module.exports = () => `
|
|
|
31
46
|
</div>
|
|
32
47
|
</div>
|
|
33
48
|
|
|
34
|
-
<div
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
>
|
|
49
|
+
<div class="modal fade"
|
|
50
|
+
id="reviewModal{{ order.id }}"
|
|
51
|
+
tabindex="-1"
|
|
52
|
+
aria-hidden="true">
|
|
53
|
+
|
|
40
54
|
<div class="modal-dialog modal-dialog-centered">
|
|
41
55
|
<div class="modal-content">
|
|
56
|
+
|
|
42
57
|
<form method="post" action="{% url 'add_review' order.id %}">
|
|
43
58
|
{% csrf_token %}
|
|
59
|
+
|
|
44
60
|
<div class="modal-header">
|
|
45
|
-
<h5 class="modal-title"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
61
|
+
<h5 class="modal-title">
|
|
62
|
+
Отзыв о курсе «{{ order.get_course_display }}»
|
|
63
|
+
</h5>
|
|
64
|
+
<button type="button"
|
|
65
|
+
class="btn-close"
|
|
66
|
+
data-bs-dismiss="modal"></button>
|
|
51
67
|
</div>
|
|
68
|
+
|
|
52
69
|
<div class="modal-body">
|
|
53
70
|
<textarea
|
|
54
|
-
name="
|
|
71
|
+
name="review"
|
|
55
72
|
class="form-control"
|
|
56
73
|
rows="4"
|
|
57
74
|
placeholder="Напишите ваш отзыв..."
|
|
58
|
-
|
|
59
|
-
if
|
|
60
|
-
order.review_text
|
|
61
|
-
%}readonly{%
|
|
62
|
-
endif
|
|
63
|
-
%}
|
|
64
|
-
>
|
|
65
|
-
{{ order.review_text }}</textarea
|
|
66
|
-
>
|
|
75
|
+
required></textarea>
|
|
67
76
|
</div>
|
|
77
|
+
|
|
68
78
|
<div class="modal-footer">
|
|
69
|
-
<button
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
data-bs-dismiss="modal"
|
|
73
|
-
>
|
|
79
|
+
<button type="button"
|
|
80
|
+
class="btn btn-secondary"
|
|
81
|
+
data-bs-dismiss="modal">
|
|
74
82
|
Закрыть
|
|
75
83
|
</button>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
{% else %}
|
|
80
|
-
<button type="button" class="btn btn-success" disabled>
|
|
81
|
-
Отзыв уже оставлен
|
|
84
|
+
<button type="submit"
|
|
85
|
+
class="btn btn-primary">
|
|
86
|
+
Отправить
|
|
82
87
|
</button>
|
|
83
|
-
{% endif %}
|
|
84
88
|
</div>
|
|
89
|
+
|
|
85
90
|
</form>
|
|
91
|
+
|
|
86
92
|
</div>
|
|
87
93
|
</div>
|
|
88
94
|
</div>
|
|
89
95
|
|
|
90
96
|
{% empty %}
|
|
91
97
|
<div class="col-12">
|
|
92
|
-
<div class="alert alert-info"
|
|
98
|
+
<div class="alert alert-info text-center">
|
|
99
|
+
У вас пока нет заявок
|
|
100
|
+
</div>
|
|
93
101
|
</div>
|
|
94
102
|
{% endfor %}
|
|
103
|
+
|
|
95
104
|
</div>
|
|
96
105
|
</div>
|
|
97
106
|
{% endblock %}
|