Создание веб-приложений на Django: практические примеры и советы
Практические подходы к разработке на Django
Как создать список статей и форму добавления с минимальным кодом?
Основной и наиболее эффективный способ - использование встроенных Class-Based Views (CBV). Они сокращают количество шаблонного кода и покрывают типовые паттерны (список, детальная страница, создание, обновление, удаление).
Пример модели для блога:
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.titleHtml css js python (интеграция python с html, css, javascript)
Для отображения списка статей используем ListView:
# views.py
from django.views.generic import ListView, CreateView
from .models import Article
from django.urls import reverse_lazy
class ArticleListView(ListView):
model = Article
template_name = 'blog/article_list.html'
context_object_name = 'articles'
paginate_by = 10
class ArticleCreateView(CreateView):
model = Article
fields = ['title', 'content']
template_name = 'blog/article_form.html'
success_url = reverse_lazy('article_list')создание сайтов python django (создание веб-сайтов на django с использованием python)
В шаблоне article_list.html выводим список и ссылку на создание:
<!-- templates/blog/article_list.html -->
<h2>Статьи</h2>
<a href="{% url 'article_create' %}">Добавить статью</a>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% empty %}
<li>Нет статей</li>
{% endfor %}
</ul>
{% include 'pagination.html' %}Python web django (web-фреймворк django)
Для формы создания ArticleCreateView автоматически генерирует форму на основе указанных полей модели. В шаблоне article_form.html стоит добавить {% csrf_token %} и вывести поля формы:
<!-- templates/blog/article_form.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сохранить</button>
</form>Python web flask (web-фреймворк flask)
Типичные ошибки:
- Забыли зарегистрировать модель в admin - не критично для работы, но удобно для проверки.
- Не указали
template_nameилиcontext_object_name- Django использует стандартные имена, что может вызвать путаницу. - Пропустили
success_urlв CreateView - после сохранения форма перенаправляет наmodel.get_absolute_url(), если не задано явно. - Не добавили
{% csrf_token %}в форму - запрос POST будет отклонен с ошибкой 403.
Как реализовать тот же функционал с помощью обычных функций?
Function-Based Views (FBV) дают полный контроль над обработкой запроса, но требуют написания шаблонного кода вручную. Подходят для сценариев, где CBV недостаточно гибки (например, сложные проверки или разные действия в зависимости от параметров).
# views.py (FBV)
def article_list(request):
articles = Article.objects.all()
paginator = Paginator(articles, 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'blog/article_list.html', {'articles': page_obj})
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return redirect('article_list')
else:
form = ArticleForm()
return render(request, 'blog/article_form.html', {'form': form})Python web server (web-сервер на python)
При этом потребуется определить форму отдельно (ArticleForm).
# forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content']Python 3 веб приложение (веб-приложение на python 3)
Типичные ошибки:
- Неверно обработаны методы HTTP (GET/POST) - форма не будет работать.
- Отсутствует импорт Paginator или параметры пагинации.
- Забыли вызвать
form.is_valid()- данные не сохранятся.
Как быстро добавить CRUD через админку без создания собственных представлений?
Если не требуется отдельный интерфейс для пользователей, можно ограничиться стандартной админкой Django. Достаточно зарегистрировать модель и настроить ModelAdmin.
# admin.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date')
search_fields = ('title', 'content')
list_filter = ('pub_date',)
Администратор получает готовый интерфейс для создания, редактирования и удаления статей. Этот подход подходит для внутренних инструментов или прототипов.
Типичные ошибки:
- Не создан суперпользователь (manage.py createsuperuser).
- Админка не настроена для работы со статикой (collectstatic).
- Не добавлены
list_display- таблица отображает только заголовок.
Расширенные примеры CBV и настройки
Ниже приведены более сложные случаи использования Class-Based Views, которые часто встречаются на практике.
Как кастомизировать CreateView для автоматической привязки автора?
Если в модели есть поле author (ForeignKey на User), его нужно заполнять текущим пользователем. Переопределим метод form_valid.
# views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
fields = ['title', 'content']
template_name = 'blog/article_form.html'
success_url = reverse_lazy('article_list')
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Результат: при создании статьи поле author автоматически получает значение текущего пользователя.
Теперь в шаблоне можно вывести автора через {{ article.author }}.
Как добавить фильтрацию и поиск в ListView?
Используем django-filter или переопределяем get_queryset.
# views.py
from django.views.generic import ListView
from django.db.models import Q
class ArticleListView(ListView):
model = Article
template_name = 'blog/article_list.html'
paginate_by = 10
def get_queryset(self):
qs = super().get_queryset()
query = self.request.GET.get('q')
if query:
qs = qs.filter(
Q(title__icontains=query) | Q(content__icontains=query)
)
return qs
В шаблоне добавим форму поиска:
<form method="get">
<input type="text" name="q" value="{{ request.GET.q }}">
<button type="submit">Поиск</button>
</form>
Результат: при вводе текста список статей фильтруется по заголовку или содержимому.
Как использовать миксины для ограничения доступа?
Для защиты CBV от неавторизованных пользователей применяются миксины из django.contrib.auth.mixins.
# views.py
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import UpdateView, DeleteView
class ArticleUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Article
fields = ['title', 'content']
template_name = 'blog/article_form.html'
success_url = reverse_lazy('article_list')
def test_func(self):
article = self.get_object()
return self.request.user == article.author # только автор может редактировать
Аналогично для DeleteView. Если пользователь не прошел тест, возвращается 403 Forbidden.