Страница со слизью не открывается
Мой slug входит в url, но страница, связанная с ним, не открывается, может кто-нибудь помочь мне с этим. Я приложил код, пожалуйста, посмотрите его и скажите мне, в чем проблема. btw это страница блога.
Models.py
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
slug = models.CharField(max_length=100)
author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
updated_on = models.DateTimeField(auto_now= True)
content = models.TextField()
created_on = models.DateTimeField(default=timezone.now())
status = models.IntegerField(choices=STATUS, default=0)
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("post_details", kwargs={"slug": self.slug})
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
font-family: "Roboto", sans-serif;
font-size: 18px;
}
.head_text {
color: white;
}
</style>
</head>
<body>
{% extends "base.html" %}
{% block content %}
<header class="masthead">
<div class="overlay"></div>
<div class="container">
<div class="row">
<div class=" col-md-8 col-md-10 mx-auto">
<div class="site-heading">
<h3 class=" site-heading my-4 mt-3 text-white"> Welcome to my awesome Blog </h3>
</p>
</div>
</div>
</div>
</div>
</header>
<div class="container">
<div class="row">
<!-- Blog Entries Column -->
<div class="col-md-8 mt-3 left">
{% for post in post_list %}
<div class="card mb-4">
<div class="card-body">
<h2 class="card-title">{{ post.title }}</h2>
<p class="card-text text-muted h6">{{ post.author }} | {{ post.created_on}} </p>
<p class="card-text">{{post.content|slice:":200" }}</p>
<a href="/blog/{{post.slug}}" class="btn btn-primary">Read More →</a>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock content %}
</body>
</html>
post_details.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% include 'base.html' %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-md-8 card mb-4 mt-3 left top">
<div class="card-body">
<h1>{% block title %} {{ object.title }} {% endblock title %}</h1>
<p class=" text-muted">{{ post.author }} | {{ post.created_on }}</p>
<p class="card-text ">{{ object.content | safe }}</p>
</div>
</div>
</div>
</div>
{% endblock content %}
</body>
</html>
view.py
def post_Detail(request, slug):
Post = Post.objects.filter(slug=slug).first()
context = {'Post': Post}
return render(request, 'blog/post_details.html')
class PostList(generic.ListView):
queryset = Post.objects.all().order_by('-created_on')
template_name = 'index.html'
urls.py
from django.urls import re_path as url
url('', views.PostList.as_view(), name='home'),
url('/<str:slug>', views.post_Detail, name='post_Detail'),
здесь в url сервера идет мой slug, но страница шаблона не меняется она остается только на индексной странице
Во-первых, вы должны указать поле slug вашей модели как SlugField
(Правильное использование). Если каждый пост уникален, вам придется задать уникальный параметр полю slug.
class Post(models.Model):
slug = models.SlugField(unique= True)
class Meta:
ordering = ['-created_on']
def get_absolute_url(self):
return reverse("post_details", kwargs={"slug": self.slug})
Во-вторых, post.slug
не является правильным использованием в шаблоне, вы должны использовать динамический url с get_absolute_url
.
<a href="/blog/{{post.get_absolute_url}}"> ...... </a>
вместо
<a href="/blog/{{post.slug}}"> ...... </a>
В-третьих, вы можете использовать get_obejct_or_404
или get
вместо фильтра.
post = Post.objects.get(slug=slug)
или
from django.shortcuts import get_object_or_404
post= get_object_or_404(Post, slug=slug)
вместо
Post = Post.objects.filter(slug=slug).first()
Вам не нужно использовать разделитель путей в начале части URL. Django делает это автоматически. Но вы также должны использовать окончания. Также django.conf.urls.url()
был устаревшим в Django 3.0, и удален в Django 4.0+. Вы можете использовать path
:
from django.urls import path
path('<slug:slug>/', views.post_Detail, name='post_Detail')