Почему моя главная страница не перенаправляет на детальный просмотр (Django)
Итак, дело в том, что я следую учебнику на codemy.com. Где-то до версии Django 5.0 я потерял свою "магию", учебник был написан для 3.8 или 4.X, возможно. Я показываю представление на основе функций, хотя я пробовал представление на основе классов, как предлагалось на codemy youtube. Причина, по которой я выбрал представление функций, заключается в том, что мне было проще отлаживать.
views.py
from django.shortcuts import render
from django.views.generic import ListView #DetailView
from django.http import HttpResponse
from .models import Post
class Home(ListView):
model = Post
template_name = "home.html"
def articleDetail(request, pk):
try:
obj = Post.objects.get(pk=pk)
return render(request, "article_detail.html", {object, obj})
except Post.DoesNotExist:
print("Object number: " + str(pk) + " not found")
return HttpResponse("Object number: " + str(pk) + " not found")
модель
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(User, on_delete=models.CASCADE)
body = models.TextField()
def __str__(self):
return str(self.title) + ' by: ' + str(self.author)
файл урлов
from django.urls import path,include
from .views import Home, articleDetail
urlpatterns = [
path('', Home.as_view(), name="home"),
path('article/<int:pk>', articleDetail,name="article-detail"),
]
шаблон для дома, работает нормально до редиректа
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Landing!!!</title>
<h1> Home Pageeeeee</h1>
</head>
<body>
<ul>
<h2>Articles</h2>
{% for article in object_list %}
<li>
<a href="{$ url 'article-detail' article.pk %}">{{article.title}}</a>
<br/>
By: {{article.author}}
<p>
{{article.body}}
</p>
</li>
{% endfor %}
</ul>
</body>
</html>
Я думаю, что моя ошибка заключается либо в том, как я передаю первичный ключ для поиска объекта, либо в том, как я запрашиваю URL-файл для нахождения документа
Вы выполняете итерацию по "списку_объектов", которому ваша функция не передает такой контекст: {object, obj}.
Если вы хотите получить доступ к вашим статьям на главной странице, вам не нужен отдельный класс или функция view. Так как вы используете django templating, я предполагаю, что вы не используете JS для загрузки в представление. Таким образом, теперь у вас будут статьи, которые вы можете зацикливать. Вам не нужна другая функция (Уберите (order_by("-created_at"), если у вас нет такой колонки, или если вы не хотите упорядочивать статьи).
)class Home(ListView):
model = Post
template_name = "home.html"
context_object_name = "articles"
def get_queryset(self):
return Post.objects.all().order_by("-created_at")