Создание веб-приложений на Django: практические примеры и советы

Раздел: Разработка на Python -> Веб-разработка

Практические подходы к разработке на 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.title

Html 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 - таблица отображает только заголовок.
- создание сайта на python (создание сайта на python)
- Django python создание приложения (создание веб-приложения на django)
- библиотека django python (библиотека django для веб-разработки на python)

Расширенные примеры 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.

Практика Django на Python - comments

En
Python django практика (python)