Ссылки
Редактирование ссылок в базовом шаблоне
Присвоить имя шаблону урла
blog/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('', posts_list), name="posts_list_url") # добавить атрибут name
]
Добавить ссылку в шаблон
templates/base.html
<a href="{% url 'posts_list_url'%}">Posts</a>
Отображение внутренного содержимого объектов через sluq
Добавить шаблон пути
blog/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('', posts_list), name="posts_list_url"),
path('post/<str:slug>/', post_detail, name='classname_detail_url') # в квадратных скобках именованнная группа символов, явно указан тип. post_detail_url - функция обрабатывающая запросы по этому урлу. name- имя шаблона урла.
]
Добавить функцию в views
blog/views.py
from django.shortcuts import render
from .models import Post
def posts_list(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', context={'posts': posts})
def post_detail(request, slug):
post = Post.objects.get(slug__iexact=slug)
return render(request, 'blog/post_detail.html', context={'post': post})
Создать шаблон
appname/templates/appame/post_detail.html
{% extends 'blog/base_blog.html' %}
{% block title %}
{{ blog.title }} - {{ block.super }} # через девис будет отображаться дефолтное содержание из родительского шаблона
{% endblock %}
{% block content %}
<h1>
{{ blog.title }}
</h1>
<p>
{{ blog.body }}
</p>
{% endblock %}
Добавить ссылку в индексный шаблон
blog/templates/blog/index.html
{% extends 'blog/base_blog.html' %}
{% block title %}
Some Title
{% endblock %}
{% block content %}
{% post var in post %}
--/--/--
--/--/--
--/--/--
<a href="{% url "post_detail_url", slug=post.slug %} }}">Read</a>
{% endfor %}
{% endblock %}
Чтобы упростить запись ссылки и не запоминать все параметры урлов, нужно добавить специальный метод
blog/models.py
--/--/--
from django.shortcuts import reverse
class Classname(models.Model):
--/--/--
--/--/--
def get_absolute_url(self):
return reverse('post_detail_url', kwargs={'slug': self.slug}) # возвращает ссылку на конкретный экземпляр класса
--/--/--
--/--/--
А в шаблоне заменить ссылку
blog/templates/blog/index.html
<a href="{% url "blog_detail_url", slug=post.slug %} }}">Read</a>
на
<a href="{{ classname.get_absolute_url }}">Read</a>
Last updated