Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@
.vscode/
__pycache__
db.sqlite3
media/
media/
venv/
/geekshop/.env
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# Django_Advanced
# django_geekshop

Shop for django course
Empty file added adminapp/__init__.py
Empty file.
1 change: 1 addition & 0 deletions adminapp/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Register your models here.
5 changes: 5 additions & 0 deletions adminapp/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class AdminappConfig(AppConfig):
name = 'adminapp'
39 changes: 39 additions & 0 deletions adminapp/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from django import forms

from authapp.forms import ShopUserRegisterForm, ShopUserProfileForm
from authapp.models import User
from mainapp.models import Product


class NewAdminRegisterForm(ShopUserRegisterForm):
avatar = forms.ImageField(widget=forms.FileInput(), required=False)

class Meta:
model = User
fields = '__all__'

def __init__(self, *args, **kwargs):
super(NewAdminRegisterForm, self).__init__(*args, **kwargs)
self.fields['avatar'].widget.attrs['class'] = 'custom-file-input'


class NewAdminProfileForm(ShopUserProfileForm):
avatar = forms.ImageField(widget=forms.FileInput(), required=False)

def __init__(self, *args, **kwargs):
super(NewAdminProfileForm, self).__init__(*args, **kwargs)
self.fields['username'].widget.attrs['readonly'] = False
self.fields['email'].widget.attrs['readonly'] = False


class ProductCreateForm(forms.ModelForm):
image = forms.ImageField(widget=forms.FileInput(), required=False)

class Meta:
model = Product
fields = '__all__'

def __init__(self, *args, **kwargs):
super(ProductCreateForm, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'form-control'
Empty file added adminapp/migrations/__init__.py
Empty file.
1 change: 1 addition & 0 deletions adminapp/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your models here.
56 changes: 56 additions & 0 deletions adminapp/templates/adminapp/admin-product-create.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{% extends "adminapp/base.html" %}
{% load staticfiles %}
{% block content %}
<h1 class="mt-4">Добавление Товара</h1>
<form action="{% url 'new_admin:admin_product_create' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-row">
<div class="col-lg-6">
<div class="form-group">
<label class="small mb-1" for="{{ form.name.id_for_label }}">Наименование Товара</label>
{{ form.name }}
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="small mb-1" for="{{ form.category.id_for_label }}">Категория</label>
{{ form.category }}
</div>
</div>
</div>
<div class="form-row mb-2">
<div class="col-lg-12">
<div class="custom-file">
{{ form.image }}
<label class="custom-file-label" for="{{ form.image.id_for_label }}">Выберите
изображение</label>
</div>
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.description.id_for_label }}">Описание</label>
{{ form.description }}
</div>
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.short_description.id_for_label }}">Краткое описание</label>
{{ form.short_description }}
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.quantity.id_for_label }}">Количество</label>
{{ form.quantity }}
</div>
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.price.id_for_label }}">Цена за единицу</label>
{{ form.price }}
</div>
</div>
<div class="form-row">
<div class="col-lg-12" style="margin-top: 33px;">
<input class="btn btn-info btn-block" type="submit" value="Сохранить">
</div>
</div>
</form>
{% endblock content %}
52 changes: 52 additions & 0 deletions adminapp/templates/adminapp/admin-product-read.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{% extends "adminapp/base.html" %}
{% load staticfiles %}
{% block content %}
<h1 class="mt-4">Товары</h1>
<div class="card mb-4">
<div class="card-header">
<i class="fas fa-table mr-1"></i>
Товары
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>Название товара</th>
<th>Категория</th>
<th>Краткое описание</th>
<th>Кол-во</th>
<th>Цена за шт</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Название товара</th>
<th>Категория</th>
<th>Краткое описание</th>
<th>Кол-во</th>
<th>Цена за шт</th>
</tr>
</tfoot>
<tbody>
{% for product in object_list %}
<tr>
<td><a href="{% url 'new_admin:admin_product_update' product.id %}"
style="color: dodgerblue">{{ product.name }}</a></td>
<td>{{ product.category.name }}</td>
<td>{{ product.short_description }}</td>
<td>{{ product.quantity }}</td>
<td>{{ product.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="card-footer">
<a href="{% url 'new_admin:admin_product_create' %}">
<button class="btn btn-success">Добавить Товар</button>
</a>
</div>
</div>
{% endblock content %}
20 changes: 20 additions & 0 deletions adminapp/templates/adminapp/admin-product-update-delete.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{% extends 'adminapp/base.html' %}
{% load staticfiles %}
{% block content %}
<h2 class="mt-4">Редактирование товара | {{ product.name }}</h2>
<div class="card-body">
<form action="{% url 'new_admin:admin_product_update' product.pk %}" method="post"
enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<div class="col-lg-12" style="margin-top: 33px;">
<input class="btn btn-info btn-block" type="submit" value="Сохранить">
</div>
</form>
<div class="col-lg-12" style="margin-top: 33px;">
<form action="{% url 'new_admin:admin_product_delete' product.id %}" method="post">
{% csrf_token %}
<input class="btn btn-danger btn-block" type="submit" value="Удалить">
</form>
</div>
{% endblock %}
61 changes: 61 additions & 0 deletions adminapp/templates/adminapp/admin-users-create.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
{% extends "adminapp/base.html" %}
{% load staticfiles %}
{% block content %}
<h1 class="mt-4">Создание пользователя</h1>
<form action="{% url 'new_admin:admin_users_create' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-row">
<div class="col-lg-6">
<div class="form-group">
<label class="small mb-1" for="{{ form.first_name.id_for_label }}">Имя</label>
{{ form.first_name }}
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="small mb-1" for="{{ form.last_name.id_for_label }}">Фамилия</label>
{{ form.last_name }}
</div>
</div>
</div>
<div class="form-row mb-2">
<div class="col-lg-12">
<div class="custom-file">
{{ form.avatar }}
<label class="custom-file-label" for="{{ form.avatar.id_for_label }}">Выберите
изображение</label>
</div>
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.username.id_for_label }}">Имя пользователя</label>
{{ form.username }}
</div>
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.email.id_for_label }}">Адрес электронной
почты</label>
{{ form.email }}
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.password1.id_for_label }}">Пароль</label>
{{ form.password1 }}
</div>
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.password2.id_for_label }}">Повторите пароль</label>
{{ form.password2 }}
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.age.id_for_label }}">Возраст</label>
{{ form.age }}
</div>
<div class="col-lg-12" style="margin-top: 33px;">
<input class="btn btn-info btn-block" type="submit" value="Сохранить">
</div>
</div>
</form>
{% endblock content %}
67 changes: 67 additions & 0 deletions adminapp/templates/adminapp/admin-users-read.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
{% extends "adminapp/base.html" %}
{% load staticfiles %}
{% block content %}
<h1 class="mt-4">Пользователи</h1>
<div class="card mb-4">
<div class="card-header">
<i class="fas fa-table mr-1"></i>
Пользователи
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>Имя пользователя</th>
<th>Имя</th>
<th>Фамилия</th>
<th>Адрес эл. почты</th>
<th>Персонал сайта</th>
<th>Активный</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Имя пользователя</th>
<th>Имя</th>
<th>Фамилия</th>
<th>Адрес эл. почты</th>
<th>Персонал сайта</th>
<th>Активный</th>
</tr>
</tfoot>
<tbody>
{% for user in object_list %}
<tr>
<td><a href="{% url 'new_admin:admin_users_update' user.id %}"
style="color: dodgerblue">{{ user.username }}</a></td>
<td>{{ user.first_name }}</td>
<td>{{ user.last_name }}</td>
<td>{{ user.email }}</td>
<td class="text-center">
{% if user.is_staff or user.is_superuser %}
<i class="fas fa-check-circle"></i>
{% else %}
<i class="fas fa-times-circle"></i>
{% endif %}
</td>
<td class="text-center">
{% if user.is_active %}
<i class="fas fa-check-circle"></i>
{% else %}
<i class="fas fa-times-circle"></i>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="card-footer">
<a href="{% url 'new_admin:admin_users_create' %}">
<button class="btn btn-success">Создать пользователя</button>
</a>
</div>
</div>
{% endblock content %}
66 changes: 66 additions & 0 deletions adminapp/templates/adminapp/admin-users-update-delete.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{% extends "adminapp/base.html" %}
{% load staticfiles %}
{% block content %}
<h1 class="mt-4">Редактирование пользователя | {{ user.username }}</h1>
<div class="card-body">
<form action="{% url 'new_admin:admin_users_update' user.id %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-row">
<div class="col-lg-6">
<div class="form-group">
<label class="small mb-1" for="{{ form.first_name.id_for_label }}">Имя</label>
{{ form.first_name }}
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="small mb-1" for="{{ form.last_name.id_for_label }}">Фамилия</label>
{{ form.last_name }}
</div>
</div>
</div>
<div class="form-row mb-2">
<div class="col-lg-12">
<div class="custom-file">
{{ form.avatar }}
<label class="custom-file-label" for="{{ form.avatar.id_for_label }}">
{% if user.avatar %}
{{ media_url }}{{ user.avatar }}
{% else %}
Выберите
изображение</label>
{% endif %}
</div>
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.username.id_for_label }}">Имя пользователя</label>
{{ form.username }}
</div>
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.email.id_for_label }}">Адрес электронной
почты</label>
{{ form.email }}
</div>
</div>
<div class="form-row">
<div class="col-lg-6">
<label class="small mb-1" for="{{ form.age.id_for_label }}">Возраст</label>
{{ form.age }}
</div>
<div class="col-lg-12" style="margin-top: 33px;">
<input class="btn btn-info btn-block" type="submit" value="Сохранить">
</div>
</div>
</form>
<div class="row">
<div class="col-lg-12" style="margin-top: 33px;">
<form action="{% url 'new_admin:admin_users_delete' user.id %}" method="post">
{% csrf_token %}
<input class="btn btn-danger btn-block" type="submit" value="Удалить">
</form>
</div>
</div>
</div>
{% endblock content %}
Loading