View — функция или класс, которая принимает HTTP-запрос и возвращает HTTP-ответ.
Функциональный view (FBV)
# tasks/views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Task
def task_list(request):
tasks = Task.objects.all()
return render(request, 'tasks/list.html', {'tasks': tasks})
def task_detail(request, pk):
task = get_object_or_404(Task, pk=pk)
return render(request, 'tasks/detail.html', {'task': task})
HttpRequest — объект запроса
def my_view(request):
request.method # 'GET', 'POST', 'PUT', 'DELETE'
request.GET # QueryDict с GET-параметрами (?q=hello)
request.POST # QueryDict с данными формы
request.user # текущий пользователь
request.path # '/tasks/1/'
request.META['HTTP_HOST'] # заголовки
HttpResponse и render
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
# Простой ответ
def simple(request):
return HttpResponse("Hello, World!")
# Рендер шаблона
def with_template(request):
context = {'name': 'Django', 'version': 5}
return render(request, 'myapp/page.html', context)
# Редирект
def after_action(request):
return redirect('/tasks/')
# или по имени URL:
return redirect('task-list')
Обработка POST-запроса
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def create_task(request):
if request.method == 'POST':
title = request.POST.get('title', '').strip()
if title:
Task.objects.create(title=title)
return redirect('task-list')
return render(request, 'tasks/create.html')
get_object_or_404
from django.shortcuts import get_object_or_404
def task_detail(request, pk):
# Вместо try/except Task.DoesNotExist
task = get_object_or_404(Task, pk=pk)
return render(request, 'tasks/detail.html', {'task': task})
Если объект не найден — автоматически возвращает 404.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!