Отображение html формы в Django
В предыдущей статье про Django мы создали приложение, модель базы данных и отразили созданную базу в приложении администратора. В сегодняшней статье мы следуя шаблону MVC - (модель, контроллер, шаблон), подключим в файле views.py приложения blog, нашу модель из models.py, и создадим функции для обращения к данным, и отображении их в html шаблоне.
Создание контроллера.
Слой моделей в файле models.py служит для создания и отражения полей базы данных. Следующий слой хранится в папке views.py, он отвечает за то что будет выводиться в ответ на запросы к странице блогa. Слой принимает запрос request и возвращает ответ в виде html шаблона страницы. То есть шаблон будет формироваться динамически в зависимости от данных в нашей базе, а сами данные при этом будут оформляться соответствующими тегами!
from django.shortcuts import render
from django.http import HttpResponse
# импорт модели
from .models import Post
def show(request):
#обращение к модели и вывод значений из нее
posts = Post.objects.all()[:10]
context = {
'title':'Post',
'posts': posts
}
# возврат шаблона с подставленными значениями
return render(request, "blog/detail.html", context)
Следующим шагом будет создание внутри каталога приложения папки template, со следующей структурой template/blog/file.html. Вложенная папка blog здесь присутствует, во избежание конфликта имен в проекте. Далее, во внутренней папке blog создаем файл index.html, содержащий в себе базовую разметку. И там же создадим detail.html
# index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<title>Posts</title>
</head>
<body>
<header class="container center-align">
<h1>Posts</h1>
</header>
<div class="container">
{% block content %}
# здесь окажется код с дочерних файлов
{% endblock %}
<br>
<a style="display: block;" class="left" href="/polls">Polls app</a>
<a style="display: block;" class="center-align" href="/admin">Admin Login</a>
</div>
</body>
</html>
# detail.html
{% extends 'blog/index.html' %}
{% block content %}
<h2 class="center-align blue lighten-2">{{title}}</h2>
<ul class="collection">
{% for post in posts %}
<li class="collection-item"><a href="/blog/details/{{post.id}}">{{post.title}}</a></li>
{% endfor %}
</ul>
{% endblock %}
Как можно заметить в обоих файлах есть общая конструкция {% block content %}---{% endblock %}. А в detail.html присутствует {% extends 'blog/index.html' %}. Это и есть шаблонизатор со своим языком. Теперь, при запросе к файлу приложения url.py, будет вызвана функция модуля views.py, которая и вернет страницу с данными.
from django.urls import path
from . import views
from django.conf.urls import url
urlpatterns = [
url(r'^details/(?P<id>\d+)/$', views.details, name = 'details'),
]
Таким образом разделение кода на отдельные компоненты уменьшает их взаимозависимость, а шаблонизатор Django минимизирует написание однообразного кода.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.