Browse Source

Авторизация и регистрация

gr421_sknal 1 year ago
parent
commit
a5e748db5a

+ 4 - 2
.idea/Django_exam.iml

@@ -1,8 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module type="PYTHON_MODULE" version="4">
   <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/venv" />
+    </content>
+    <orderEntry type="jdk" jdkName="Python 3.12 (Django_exam)" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
 </module>

+ 1 - 1
.idea/misc.xml

@@ -3,5 +3,5 @@
   <component name="Black">
     <option name="sdkName" value="Python 3.11" />
   </component>
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (Django_exam)" project-jdk-type="Python SDK" />
 </project>

BIN
store/db.sqlite3


+ 14 - 0
store/main/forms.py

@@ -0,0 +1,14 @@
+from django import forms
+from .models import NewUser, Item
+
+
+class RegisterUserForm(forms.ModelForm):
+    class Meta:
+        model = NewUser
+        fields = ('username', 'email', 'password')
+
+
+class ItemForm(forms.ModelForm):
+    class Meta:
+        model = Item
+        fields = ('__all__')

+ 34 - 0
store/main/migrations/0002_item.py

@@ -0,0 +1,34 @@
+# Generated by Django 5.0 on 2023-12-26 02:43
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("main", "0001_initial"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="Item",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("title", models.CharField(max_length=100)),
+                ("short_desc", models.CharField(max_length=200)),
+                ("full_desc", models.TextField()),
+                ("image", models.ImageField(upload_to="image/")),
+            ],
+            options={
+                "verbose_name": "Товар",
+                "verbose_name_plural": "Товары",
+            },
+        ),
+    ]

+ 6 - 6
store/main/models.py

@@ -1,12 +1,12 @@
 from django.db import models
 from django.contrib.auth.models import AbstractUser
 
-class Item:
-    title = models.CharField(max_length=100)
-    short_desc = models.CharField(max_length=200)
-    full_desc = models.TextField()
-    price = models.DecimalField(max_digits=5),
-    image = models.ImageField(upload_to='/media/')
+class Item(models.Model):
+    title = models.CharField('Заголовок',max_length=100)
+    short_desc = models.CharField('Краткое описание',max_length=200)
+    full_desc = models.TextField('Полное описание')
+    price = models.DecimalField('Стоимость',max_digits=5),
+    image = models.ImageField('Изображение',upload_to='image/')
 
     def __str__(self):
         return f'{self.title}'

+ 14 - 0
store/main/templates/accounts/login.html

@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block title %} Авторизация {% endblock %}
+
+{% block content %}
+
+    <h3>Вход</h3>
+    <form method="post" action="{% url 'login' %}">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button type="submit">Войти</button>
+    </form>
+
+{% endblock %}

+ 15 - 0
store/main/templates/accounts/registration.html

@@ -0,0 +1,15 @@
+{% extends 'base.html' %}
+
+{% block title %} Регистрация {% endblock %}
+
+{% block content %}
+<h1>Регистрация</h1>
+
+<form method="post">
+    {% csrf_token %}
+    <input type="hidden" name="next" value="{{ next }}" />
+    {{ form.as_p }}
+    <p ><button type="submit">Регистрация</button></p>
+</form>
+
+{% endblock %}

+ 10 - 0
store/main/templates/accounts/registration_done.html

@@ -0,0 +1,10 @@
+{% extends 'base.html' %}
+
+{% block title %} Успешная регистрация {% endblock %}
+
+{% block content %}
+<h1>Добро пожаловать!</h1>
+
+<p >Вы успешно зарегистрировались на сайте! Для входа в систему необходимо авторизоваться по этой <a href="{% url 'login' %}">ссылке</a>
+</p>
+{% endblock %}

+ 2 - 0
store/main/templates/base.html

@@ -1,3 +1,5 @@
+{% load static%}
+{% load bootstrap4 %}
 <!doctype html>
 <html lang="en">
 <head>

+ 8 - 0
store/main/templates/index.html

@@ -4,4 +4,12 @@
 
 {% block content %}
 <h1>Главная страница</h1>
+    {% for item in items%}
+        <div class="requests">
+            <h5 class="index-title">{{item.title}}</h5>
+            <p>{{item.short_desc}}</p>
+            <img src="{{item.image.url}}" width="350px" height="250px">
+            <a href="" class="btn btn-warning">Подробнее</a>
+        </div>
+    {% endfor %}
 {% endblock %}

+ 18 - 0
store/main/templates/main/add_item.html

@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block title %} Добавить товар {% endblock %}
+
+{% block content %}
+    {% if user.is_authenticated %}
+
+    <h3>Добавление товара</h3>
+    <form method="post" action="{% url 'add_item' %}" enctype="multipart/form-data">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button type="submit">Добавить</button>
+    </form>
+    {% else %}
+    <p>Авторизуйтесь, чтобы добавлять товары</p>
+    {% endif %}
+
+{% endblock %}

+ 0 - 6
store/main/templates/main/login.html

@@ -1,6 +0,0 @@
-{% extends 'base.html' %}
-
-{% block title %}Авторизация{% endblock %}
-
-{% block content %}
-{% endblock %}

+ 2 - 0
store/main/templates/main/profile.html

@@ -1,6 +1,8 @@
 {% extends 'base.html' %}
 
 {% block title %}Профиль{% endblock %}
+<h1>Профиль</h1>
+
 
 {% block content %}
 {% endblock %}

+ 0 - 6
store/main/templates/main/register.html

@@ -1,6 +0,0 @@
-{% extends 'base.html' %}
-
-{% block title %}Регистрация{% endblock %}
-
-{% block content %}
-{% endblock %}

+ 2 - 0
store/main/templates/main/services.html

@@ -3,4 +3,6 @@
 {% block title %}Товары{% endblock %}
 
 {% block content %}
+    <h1>Все товары</h1>
+    <a href="{% url 'add_item' %}">Добавить товар</a>
 {% endblock %}

+ 6 - 5
store/main/urls.py

@@ -1,13 +1,14 @@
 from django.urls import path
-from .views import index, login, services, search, profile
+from .views import index, login_view, services, search, profile, logout_view, register, add_item
 
 urlpatterns = [
-    path('', index, name = 'index'),
-    path('login/', login, name = 'login'),
+    path('', index.as_view(), name = 'index'),
+    path('login/', login_view, name = 'login'),
     path('services/', services, name = 'services'),
     path('search/', search, name = 'search'),
     path('profile/', profile, name = 'profile'),
-    path('register/', profile, name = 'register'),
-    path('logout/', profile, name = 'logout'),
+    path('register/', register, name = 'register'),
+    path('logout/', logout_view, name = 'logout'),
+    path('add/', add_item, name = 'add_item'),
 
 ]

+ 40 - 8
store/main/views.py

@@ -1,10 +1,14 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
+from .models import Item
+from django.views.generic.base import View
+from django.contrib.auth import logout
+from django.contrib.auth.views import LoginView
+from .forms import RegisterUserForm, ItemForm
+class index(View):
+    def get(self, request):
+        items = Item.objects.all()[:5]
+        return render(request, 'index.html', {'items': items})
 
-def index(request):
-    return render(request, 'index.html')
-
-def login(request):
-    return render(request, 'main/login.html')
 
 def search(request):
     return render(request, 'main/search.html')
@@ -15,5 +19,33 @@ def services(request):
 def profile(request):
     return render(request, 'main/profile.html')
 
-def profile(request):
-    return render(request, 'main/profile.html')
+
+
+login_view = LoginView.as_view(template_name='accounts/login.html')
+
+def register(request):
+    if request.method == "POST":
+        form = RegisterUserForm(request.POST)
+        if form.is_valid():
+            user = form.save(commit=True)  # создание объекта без сохранения в БД
+            user.set_password(form.cleaned_data['password'])
+            user.save()
+            return render(request, 'accounts/registration_done.html')
+    else:
+        form = RegisterUserForm()
+    return render(request, 'accounts/registration.html', {'form': form})
+
+def logout_view(request):
+    logout(request)
+    return redirect('index')
+
+def add_item(request):
+    if request.method == "POST":
+        form = ItemForm(request.POST, request.FILES)
+        if form.is_valid():
+            form.save()
+            return redirect('index')
+    else:
+        form = ItemForm()
+    return render(request, 'main/add_item.html', {'form': form})
+

BIN
store/media/image/dm8465-100-0.jpg


BIN
store/media/image/dm8465-100-0_FoaJFrZ.jpg


+ 9 - 0
store/store/settings.py

@@ -1,4 +1,5 @@
 from pathlib import Path
+import os
 
 # Build paths inside the project like this: BASE_DIR / 'subdir'.
 BASE_DIR = Path(__file__).resolve().parent.parent
@@ -113,3 +114,11 @@ STATIC_URL = "static/"
 # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
 
 DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
+
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
+MEDIA_URL = '/media/'
+
+LOGIN_URL = '/login'
+LOGIN_REDIRECT_URL = '/profile'
+
+LOGOUT_REDIRECT_URL = '/'

+ 1 - 1
store/store/urls.py

@@ -6,4 +6,4 @@ from django.conf.urls.static import static
 urlpatterns = [
     path('admin/', admin.site.urls),
     path('', include('main.urls')),
-] + static(settings.MEDIA_URL, document_root=settings)
+] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)