Создание простого Django сайта с контактной формой и сохранением полученной информации в базе данных

Я буду использовать PyCharm Community, вы можете использовать ваш любимый редактор кода. Активируйте виртуальную среду с помощью команды:

source projectvenv/bin/activate

Install Django:

pip3 install Django

Новый проект Django создается командой django-admin startproject (имя проекта выберите сами):

django-admin startproject projectsite

Приложение создается командой python3 manage.py startapp (название проекта выберите сами):

python3 manage.py startapp mysite

Структура нашего проекта:

Запустим веб-сервер Django:

python3 manage.py runserver

Зарегистрируем только что созданное приложение в проекте. Найдем файл settings.py в пакете конфигурации, откроем его в текстовом редакторе и найдем следующий фрагмент кода:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mysite', #new app
]
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте создадим нашу модель. Откроем файл models.py и добавим этот код:

from django.db import models


class Task(models.Model):
    title = models.CharField(max_length=50)
    task = models.TextField()

    def __str__(self):
        return self.title


class Note(models.Model):
    title = models.CharField(max_length=50)
    task = models.TextField()

    def __str__(self):
        return self.title


class About(models.Model):
    title = models.CharField(max_length=50)
    task = models.TextField()

    def __str__(self):
        return self.title


class Contact(models.Model):
    email = models.EmailField()
    subject = models.CharField(max_length=255)
    message = models.TextField()

    def __str__(self):
        return self.email
Вход в полноэкранный режим Выйти из полноэкранного режима

CharField — Строковое поле, для строк от маленького до большого размера.
TextField — большое текстовое поле. Виджет формы по умолчанию для этого поля — Textarea.
EmailField — поле CharField, которое проверяет, является ли значение действительным адресом электронной почты, используя EmailValidator.

Далее мы генерируем и выполняем миграции с помощью команд:

python3 manage.py makemigrations

python3 manage.py migrate

Теперь мы можем начать использовать панель администратора. Но для этого нам нужен пользователь. Вы можете создать его следующим образом: python manage.py createsuperuser. После этого мы запускаем сервер и переходим на http://127.0.0.1:8000/admin/. Вы увидите:

Затем откроем файл admin.py приложения mysite и добавим этот код:

from django.contrib import admin
from .models import Task, Note, About, Contact

admin.site.register(Task)
admin.site.register(Note)
admin.site.register(About)
admin.site.register(Contact)
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот что происходит в итоге:

Создадим файл forms.py в каталоге приложения mysite:

from django.forms import ModelForm
from .models import Contact


class ContactForm(ModelForm):
    class Meta:
        model = Contact
        fields = '__all__'
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте откроем views.py вашего приложения mysite и добавим этот код:

from django.shortcuts import render
from .models import Task, Note, About
from .forms import ContactForm


def index(request):
    tasks = Task.objects.all()
    return render(request, 'index.html', {'tasks': tasks})


def about(request):
    self = About.objects.all()
    return render(request, 'about.html', {'self': self})


def blog(request):
    notes = Note.objects.all()
    return render(request, 'blog.html', {'notes': notes})

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            form.save()
            return render(request, 'success.html')
    form = ContactForm()
    context = {'form': form}
    return render(request, 'contacts.html', context)
Вход в полноэкранный режим Выйти из полноэкранного режима

Создадим urls.py в каталоге приложения mysite:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='home'),
    path('about', views.about, name='about'),
    path('blog', views.blog, name='blog'),
    path('contact', views.contact_view, name='contacts'),
]
Войти в полноэкранный режим Выйти из полноэкранного режима

Откроем urls.py из каталога projectsite и добавим этот код:

from django.contrib import admin
from django.urls import path, include
from mysite import views as contact_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mysite.urls')),
    path('contacts/', contact_views.contact_view, name='contacts'),
]
Вход в полноэкранный режим Выйти из полноэкранного режима

Откроем settings.py и добавим этот код:

import os
...
STATICFILES_DIRS = [
   os.path.join(BASE_DIR, "static"),
]
Вход в полноэкранный режим Выйти из полноэкранного режима

Создадим статическую директорию и создадим в ней файл contact.css:

input[type=text], input[type=email], textarea {
 width: 100%;
 padding: 12px 20px;
 margin: 8px 0;
 display: inline-block;
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Создадим папку templates и в ней создадим:

base.html

{% load static %}
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css">
    <link href="{% static "/contact.css" %}" rel="stylesheet">
    <title>MySite{% block title %}{% endblock title %}</title>
</head>
<body>
    <div class="d-flex flex-column flex-md-row align-items-center pb-3 mb-4 border-bottom">
      <a href="/" class="d-flex align-items-center text-dark text-decoration-none">
        <svg xmlns="http://www.w3.org/2000/svg" width="40" height="32" class="me-2" viewBox="0 0 118 94" role="img"><title>Bootstrap</title><path fill-rule="evenodd" clip-rule="evenodd" d="M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z" fill="currentColor"></path></svg>
        <span class="fs-4">MySite</span>
      </a>

      <nav class="d-inline-flex mt-2 mt-md-0 ms-md-auto">
        <a class="me-3 py-2 text-dark text-decoration-none" href="/">Home</a>
        <a class="me-3 py-2 text-dark text-decoration-none" href="/blog">Blog</a>
        <a class="me-3 py-2 text-dark text-decoration-none" href="/about">About</a>
        <a class="me-3 py-2 text-dark text-decoration-none" href="/contacts">Contact</a>
      </nav>
    </div>

        <div class="container">
        {% block content %}

        {% endblock content %}
        </div>

</body>
</html>
Войти в полноэкранный режим Выйти из полноэкранного режима

index.html

{% extends 'base.html' %}
{% block content %}
    {% for el in tasks %}
        <div class="container">
        <h3>{{ el.title }}</h3>
        <p>{{ el.task }}</p>
        </div>
    {% endfor %}

{% endblock content %}
Войти в полноэкранный режим Выйти из полноэкранного режима

блог.html

{% extends 'base.html' %}
{% block content %}

    {% for el in notes %}
        <div class="container">
        <h3>{{ el.title }}</h3>
        <p>{{ el.task }}</p>
        </div>
    {% endfor %}

{% endblock content %}
Войти в полноэкранный режим Выйти из полноэкранного режима

контакты.html
(Здесь мы используем csrf_token, он необходим для защиты от межсайтовой подделки запросов, каждая внутренняя форма должна использовать его)

{% extends 'base.html' %}
{% block content %}

    <form action="" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Submit">
    </form>

{% endblock content %}
Вход в полноэкранный режим Выход из полноэкранного режима

about.html

{% extends 'base.html' %}
{% block content %}
    {% for el in self %}
        <div class="container">
        <h3>{{ el.title }}</h3>
        <p>{{ el.task }}</p>
        </div>
    {% endfor %}
{% endblock content %}
Вход в полноэкранный режим Выйти из полноэкранного режима

success.html

<h1>We have received your letter</h1>
<p>We will consider it and we will answer you.</p>
Вход в полноэкранный режим Выйти из полноэкранного режима

Запустим сервер Django и перейдем в админ-панель сайта, затем перейдем в раздел Задачи. Заполните поля и сохраните:

Наша запись будет отображаться на сайте в разделе Главная:

Откройте раздел Contact и заполните его:

После отправки на экране появится следующее сообщение:

Заходим в административную панель сайта, затем переходим в раздел Контакты и видим свое сообщение:

На этом все, наш обучающий проект закончен.

Оцените статью
devanswers.ru
Добавить комментарий