Использование сгенерированного Django URL slug для ссылок на определенные страницы
Здравствуйте щедрые и добрые люди Stack Overflow. Я довольно новичок в Python и Django и взялся за проект по созданию портфолио для моего копирайтинга
У меня есть главная целевая страница, на которой будет сетка из 9 различных писательских проектов. Кто-то нажмет на одно из изображений проекта, а затем перейдет на новую страницу с более подробным описанием проекта.
Каждая отдельная страница проекта имеет URL, путь к которому содержит slug. Код, который у меня есть, работает на генерации этого пути. Каждый пишущий проект будет иметь URL путь, который содержит projects/(slug)
Моя проблема в том, что я не могу заставить эту ссылку на основе slug, которая будет указывать на каждую отдельную страницу, работать в моем коде. Я получаю эту ошибку: NoReverseMatch at / Reverse for 'individual_project' not found. 'individual_project' не является действительной функцией представления или именем шаблона.
Прошу простить любые неточности в этом коде, так как мне трудновато понять все это.
Вот мой views.py:
from django.shortcuts import render, get_object_or_404, get_list_or_404
from .models import Project
def individual_project_view(request, project_id):
projectpage = get_list_or_404(Project, slug=project_id)
return render(request, 'projects/project_detail.html', {'projectpage':projectpage})
def project_home(request):
portfolioprojects = get_list_or_404(Project)
return render(request, 'projects/project_detail.html', {'portfolioprojects':portfolioprojects})
Вот мой urls.py:
from django.urls import path, include
from projects import views
app_name = 'portfolio'
urlpatterns = [path('<slug:project_id>', views.individual_project_view, name='individual_project'),]
И наконец, мой HTML:
<a href="{% url 'individual_project' %}">
<img src="{{ project.image.url }}" class="img-fluid mb-2"></a>
{% endif %}
<div>
<h2 class= "category">{{ project.category }}</h2>
<h3 class="client">{{ project.description }}</h3>
<h4 class="project_type">{{ project.title }}</h4>
</div>
Спасибо, что прочитали - и я ценю помощь!
Вам нужно добавить выражение для slug в тег шаблона {% url … %}
[Django-doc]:
<a href="{% url 'portfolio:individual_project' project.slug %}">
Поскольку вы определили app_name
в urls.py
, вам нужно префикс app_name
, поэтому portfolio:individual_project
вместо .individual_project
Для правильного обратного пути по имени вы должны указать не только имя, но и аргументы, если они определены для этого пути. Поэтому правильным вариантом использования {% url %} в данном случае будет
<a href="{% url 'individual_project' project.slug %}">
У вас есть два варианта:
<a href="{% url 'individual_project' project.slug %}">
или вы используете метод "reverse" от django. в вашем классе model:
from django.urls import reverse
# this method called automaticallly by django. we are manuallly calling it here
def get_absolute_url(self):
# u create url only here and then reference here throughout of your project
return reverse("individual_project",args=[self.slug])
в вашем шаблоне:
# looks like instance_of_model is project.
# we are not hardcoding the url, passing a reference
<a href="{{project.get_absolute_url}}"> </a>