![](/img/trans.png)
[英]How to fix this: Reverse for 'post_detail' with keyword arguments '{'slug': ''}' not found. 1 pattern(s) tried: ['(?P<slug>[-a-zA-Z0-9_]+)/$']?
[英]Reverse for 'post_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['post/(?P<slug>[-\\w]+)/$']
使用 Django 1.11 | 出现这个问题,我以为是因为我从另一个项目中复制了一些网址和视图,但即使删除后,问题还是再次出现。 我只是想删除我的 PostImg 字段并将图像字段添加为 FileField,但是即使在删除数据库和所有迁移等之后也没有 postImg 字段的问题。这个问题只发生在我没有帖子(不是对象模型 Post) 在我的数据库中。 我可以登录管理员没问题,然后创建一个帖子,然后它就可以工作了。 我认为这是因为我',显示所有带有模板标签的帖子,如果没有对象,这些标签就无法处理它。
注意:我在添加 slug 时遇到了麻烦,但我找到了一个很好的方法(我不会有任何重复的博客标题)。 但是,这个问题甚至在我添加 slug 之前就发生了。
基本文件
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'css/main.css' %}">
<script src="//cdn.jsdelivr.net/medium-editor/latest/js/medium-editor.min.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/medium-editor/latest/css/medium-editor.min.css" type="text/css" media="screen" charset="utf-8">
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<title>
Base working
</title>
<head>
<body>
<div class="container">
<img class="top_logo" src="https://electrek.co/wp-content/uploads/sites/3/2018/08/SX3Semi-Family-e1534526883239.jpg?quality=82&strip=all&w=1600">
</div>
<nav class="navbar navbar-expand-md navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="{% url 'blog:home' %}">Home</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'blog:post_list' %}">Archive</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" href="#" tabindex="-1" aria-disabled="true"></a>
</li>
</ul>
<ul class="navbar-nav navbar-right">
<li class="nav-item">
{% if user.is_authenticated %}
<a class="nav-link" href="{% url 'logout' %}">Log Out</a>
{% else %}
<a class="nav-link" href="{% url 'login' %}">Log In</a>
{% endif %}
</li>
{% if not user.is_authenticated %}
<li class="nav-item">
<a class="nav-link" href="{% url 'register' %}">Sign up</a>
</li>
{% endif %}
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</div>
</nav>
<div class="container">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}"> {{ message }}
</div>
{% endfor %}
{% endif %}
</div>
<main role="main" class="container">
<div class="row">
<div class="col-lg-9 customcontainer">
{% block content %}
{% endblock %}
</div>
<!-- SideBar -->
<div class="col-sm d-none d-lg-block">
<article class="info_box">
BONUS TEXT
asdgfdg gararg rsiogj origj g grjiog orej greiog jreaoig jaeorig jioareg joiareg jioaergj ioaergjio
</article>
<br/>
<article class="info_box">
BONUS TEXT
asdgfdg gararg rsiogj origj g grjiog orej greiog jreaoig jaeorig jioareg joiareg jioaergj ioaergjio
</article>
<br/>
<article class="info_box">
BONUS TEXT
asdgfdg gararg rsiogj origj g grjiog orej greiog jreaoig jaeorig jioareg joiareg jioaergj ioaergjio
</article>
<br/>
<a href="https://www.tesla.com/models">
<img class="sidebar_img_link" src="https://www.tesla.com/sites/tesla/files/carousel/image/charger-1%402.jpg">
</a>
</div>
</div>
</main>
<footer class="home_footer">
<div class="container">
<div class="row">
<div class="footer_item col-sm">
<a href="#">Contact Us</a>
</div>
<div class="footer_item col-sm">
<h4 class="">Copyright </h4>
</div>
<div class="footer_item col-sm">
<a href="">Partner with me</a>
</div>
</div>
</div>
</footer>
</body>
</html>
home.html (我试图访问的页面)
{% extends 'blog/base.html' %}
{% block content %}
<div class="intro_text">
<h3>Hello and welcome!</h3>
<article>
this is the official PhyBlog! We talk about all thing physics and engineering here, mainly concerning the environment and global heating,
</article>
</div>
<br>
<div class="home_text">
<div class="latest_post">
{% with post_list|first as post %}
<img class=" home_post_img" src="{{ post.postImg }}">
<h2><a class="post_title_a" href="{% url 'blog:post_detail' post.slug %}">{{ post.title }}</a></h2>
<article class="intro_text">{{ post.text|safe|truncatewords:20 }}</article> <a class="post_more_a" href="{% url 'blog:post_detail' post.slug %}">mehr lesen</a>
<p class="post_list_pub">Posted: {{ post.published_date }}</p>
{% endwith %}
</div>
</div>
<br>
<h1>Hello and welcome on the Homepage!</h1>
<div class="filler">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut est lorem, congue sed eleifend ac, luctus non mauris. Praesent scelerisque quam eu metus tristique, eu luctus ligula dictum. Sed eu felis aliquam, maximus enim sed, tempus turpis. Cras et sapien lacus. Mauris nec enim mollis, pulvinar augue vel, mollis elit. Fusce nec sem finibus lorem imperdiet tempus eu eget purus. Donec ac sagittis est. Phasellus vitae vehicula lacus. Nulla facilisi. <br/>
Pellentesque odio dui, finibus vitae nunc slug, varius cursus risus. Etiam mollis augue a vulputate venenatis. Nulla et purus vestibulum, hendrerit mauris slug, dignissim ligula. Vivamus ut arcu vehicula, vehicula ante vel, aliquam sem. Pellentesque at maximus quam. Nunc condimentum erat eu tellus suscipit, ut finibus ipsum semper. Ut rhoncus vel metus sed rutrum. Fusce tellus odio, auctor non lacus sit amet, sagittis gravsluga enim. Praesent porttitor dui nec metus vulputate, sit amet vulputate urna ornare.<br/>
Curabitur lacinia ut tellus eu scelerisque. In hac habitasse platea dictumst. Fusce pulvinar egestas nibh sed porttitor. Nulla consectetur massa ut mattis vehicula. Nullam tempus mattis enim, sit amet fermentum massa varius sit amet. Nullam slug sem vel sem luctus scelerisque vel vel nisi. Ut ultrices vel dui semper dapibus. Proin velit lacus, vehicula ac tincslugunt in, aliquam ac arcu.<br/>
Cras nec quam blandit, facilisis justo nec, faucibus quam. Cras sed lobortis augue. Fusce justo mauris, commodo egestas ornare sed, porta slug lectus. Sed nulla nibh, molestie vitae faucibus nec, vulputate tristique ipsum. Etiam hendrerit nisi diam, pulvinar rutrum diam viverra in. Donec blandit metus in nibh tristique tempor. Proin rhoncus dolor sed lorem convallis, eu vehicula quam congue. Sed scelerisque tellus ac tellus semper laoreet. Maecenas laoreet vehicula congue. Cras imperdiet egestas tellus, in porttitor nulla tempus quis. Proin gravsluga nibh ut nunc tincslugunt, non venenatis nisl mattis. Morbi efficitur congue nunc. Proin hendrerit ipsum non orci finibus, et ultricies massa finibus. In sodales, massa slug elementum elementum, quam lectus consequat lectus, nec ornare justo augue sit amet sem. Praesent ac porta ligula.<br/>
Etiam augue quam, aliquet vel mi ut, vestibulum congue tortor. Aliquam congue, nunc a auctor mollis, elit tellus aliquam augue, at ornare ante nisi slug lectus. Praesent quis semper mi. Nulla scelerisque lacus ut nisl molestie aliquet. Morbi lobortis tincslugunt felis, ac gravsluga erat. Aenean eu tristique elit. Quisque malesuada lacus in sem dictum, quis faucibus mi euismod. Quisque ut ante ut nibh laoreet venenatis.<br/>
</div>
<br/>
<h1>Recent posts:</h1>
<div class="posts">
<div class="popular_posts">
{% for post in post_list %}
<div class="post_homepage row">
<img class="col-xs home_post_list_img" src="{{ post.postImg }}">
<div class="col-lg">
<h2><a class="post_title_a" href="{% url 'blog:post_detail' post.slug %}">{{ post.title }}</a></h2>
<article class="intro_text">{{ post.text|safe|truncatewords:50 }}</article> <a class="post_more_a" href="{% url 'blog:post_detail' post.slug %}">mehr lesen</a>
<p class="post_list_pub">Posted: {{ post.published_date }}</p>
</div>
</div>
<br>
{% endfor %}
</div>
</div>
{% endblock %}
博客/views.py
from django.utils import timezone
from blog.models import Post, Comment
from blog.forms import PostForm, CommentForm
from django.views.generic import (TemplateView,
ListView,
DetailView,)
class HomeView(ListView):
template_name = "home.html"
model = Post
def get_queryset(self):
return Post.objects.all().order_by('-published_date')
class PostListView(ListView):
model = Post
def get_queryset(self):
return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
class PostDetailView(DetailView):
model = Post
slug_field = 'slug'
博客/网址.py
from . import views
from django.conf.urls import url
urlpatterns = [
url(r'^$', views.HomeView.as_view(), name="home"),
url(r'^posts/$', views.PostListView.as_view(), name="post_list"),
url(r'^post/(?P<slug>[-\w]+)/$', views.PostDetailView.as_view(),name="post_detail"),
]
模型.py
from django.db import models
from django.utils import timezone
from django.urls import reverse
from django.db.models.signals import pre_save
from django.utils.text import slugify
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
teaser_text = models.CharField(max_length=300, default="",blank=True,null=True)
text = models.TextField()
slug = models.SlugField(max_length=200, null=True, blank=True)
image = models.FileField(null=True, blank=True)
postImg = models.CharField(max_length=5000, null=True, blank=True)
created_date = models.DateTimeField(
default=timezone.now)
published_date = models.DateTimeField(
blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def approve_comments(self):
return self.comments.filter(approved_comment=True)
def get_absolute_url(self):
return reverse('blog:post_detail',kwargs={'pk':self.pk})
def __str__(self):
return self.title
def slug_generator(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = slugify(instance.title)
pre_save.connect(slug_generator, sender=Post)
class Comment(models.Model):
post = models.ForeignKey('blog.Post', related_name='comments', on_delete=models.CASCADE)
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=False)
def approve(self):
self.approved_comment = True
self.save()
def get_absolute_url(self):
return reverse("post_list")
def __str__(self):
return self.text
项目的 urls.py
from django.conf.urls import url
from django.contrib.auth import views as auth_views
from django.contrib import admin
from django.conf.urls import include
from users import views as user_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(("blog.urls", "blog"), namespace="blog")),
url(r'^register/', user_views.register, name="register"),
url(r'^profile/', user_views.profile, name="profile"),
url(r'^login/', auth_views.LoginView.as_view(template_name="users/login.html", redirect_authenticated_user=True), name="login"),
url(r'^logout/', auth_views.LogoutView.as_view(template_name="users/logout.html"), name="logout"),
]
设置.py
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR,'blog/templates/blog')
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '$j+l6i#857mae-*onf%=i7zta&l&bbxt8^bso4_376b9cr3@h1'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["127.0.0.1", "www.pythonanywhere.com"]
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'users',
'crispy_forms',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'phyblog.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATE_DIR],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'phyblog.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Europe/Berlin'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
STATIC_DIR = os.path.join(BASE_DIR, 'blog/static/')
CRISPY_TEMPLATE_PACK = 'bootstrap4'
LOGIN_REDIRECT_URL = 'blog:home'
LOGIN_URL = 'login'
如果我遗漏了任何文件,请告诉我,否则,非常感谢您的帮助
我找到了答案。 所以通常,我总是使用 for 循环来遍历模板中 post_list 中的所有帖子。 这适用于{% for post in post_list %}
因为它只在有对象时迭代。 因此,我将最新的帖子放在顶部,而不是在 for 循环中,模板中的 with 语句: {% with post_list|first as post %}
尝试运行,尽管帖子列表中没有对象。 因此,我只需要在post_list中添加一个检查是否有任何帖子,因此home.html中的代码变为:
{% extends 'blog/base.html' %}
{% block content %}
<div class="intro_text">
<h3>Hello and welcome!</h3>
<article>
this is the official PhyBlog! We talk about all thing physics and engineering here, mainly concerning the environment and global heating,
</article>
</div>
<br>
<div class="home_text">
<div class="latest_post">
{% if post_list %}
{% with post_list|first as post %}
<img class=" home_post_img" src="{{ post.postImg }}">
<h2><a class="post_title_a" href="{% url 'blog:post_detail' post.slug %}">{{ post.title }}</a></h2>
<article class="intro_text">{{ post.text|safe|truncatewords:20 }}</article> <a class="post_more_a" href="{% url 'blog:post_detail' post.slug %}">mehr lesen</a>
<p class="post_list_pub">Posted: {{ post.published_date }}</p>
{% endwith %}
{% endif %}
</div>
</div>
<br>
<h1>Hello and welcome on the Homepage!</h1>
<div class="filler">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut est lorem, congue sed eleifend ac, luctus non mauris. Praesent scelerisque quam eu metus tristique, eu luctus ligula dictum. Sed eu felis aliquam, maximus enim sed, tempus turpis. Cras et sapien lacus. Mauris nec enim mollis, pulvinar augue vel, mollis elit. Fusce nec sem finibus lorem imperdiet tempus eu eget purus. Donec ac sagittis est. Phasellus vitae vehicula lacus. Nulla facilisi. <br/>
Pellentesque odio dui, finibus vitae nunc slug, varius cursus risus. Etiam mollis augue a vulputate venenatis. Nulla et purus vestibulum, hendrerit mauris slug, dignissim ligula. Vivamus ut arcu vehicula, vehicula ante vel, aliquam sem. Pellentesque at maximus quam. Nunc condimentum erat eu tellus suscipit, ut finibus ipsum semper. Ut rhoncus vel metus sed rutrum. Fusce tellus odio, auctor non lacus sit amet, sagittis gravsluga enim. Praesent porttitor dui nec metus vulputate, sit amet vulputate urna ornare.<br/>
Curabitur lacinia ut tellus eu scelerisque. In hac habitasse platea dictumst. Fusce pulvinar egestas nibh sed porttitor. Nulla consectetur massa ut mattis vehicula. Nullam tempus mattis enim, sit amet fermentum massa varius sit amet. Nullam slug sem vel sem luctus scelerisque vel vel nisi. Ut ultrices vel dui semper dapibus. Proin velit lacus, vehicula ac tincslugunt in, aliquam ac arcu.<br/>
Cras nec quam blandit, facilisis justo nec, faucibus quam. Cras sed lobortis augue. Fusce justo mauris, commodo egestas ornare sed, porta slug lectus. Sed nulla nibh, molestie vitae faucibus nec, vulputate tristique ipsum. Etiam hendrerit nisi diam, pulvinar rutrum diam viverra in. Donec blandit metus in nibh tristique tempor. Proin rhoncus dolor sed lorem convallis, eu vehicula quam congue. Sed scelerisque tellus ac tellus semper laoreet. Maecenas laoreet vehicula congue. Cras imperdiet egestas tellus, in porttitor nulla tempus quis. Proin gravsluga nibh ut nunc tincslugunt, non venenatis nisl mattis. Morbi efficitur congue nunc. Proin hendrerit ipsum non orci finibus, et ultricies massa finibus. In sodales, massa slug elementum elementum, quam lectus consequat lectus, nec ornare justo augue sit amet sem. Praesent ac porta ligula.<br/>
Etiam augue quam, aliquet vel mi ut, vestibulum congue tortor. Aliquam congue, nunc a auctor mollis, elit tellus aliquam augue, at ornare ante nisi slug lectus. Praesent quis semper mi. Nulla scelerisque lacus ut nisl molestie aliquet. Morbi lobortis tincslugunt felis, ac gravsluga erat. Aenean eu tristique elit. Quisque malesuada lacus in sem dictum, quis faucibus mi euismod. Quisque ut ante ut nibh laoreet venenatis.<br/>
</div>
<br/>
<h1>Recent posts:</h1>
<div class="posts">
<div class="popular_posts">
{% for post in post_list %}
<div class="post_homepage row">
<img class="col-xs home_post_list_img" src="{{ post.postImg }}">
<div class="col-lg">
<h2><a class="post_title_a" href="{% url 'blog:post_detail' post.slug %}">{{ post.title }}</a></h2>
<article class="intro_text">{{ post.text|safe|truncatewords:50 }}</article> <a class="post_more_a" href="{% url 'blog:post_detail' post.slug %}">mehr lesen</a>
<p class="post_list_pub">Posted: {{ post.published_date }}</p>
</div>
</div>
<br>
{% endfor %}
</div>
</div>
{% endblock %}
只需在 with 块周围添加一个检查 {% if post_list %} 以确保它仅在我在数据库中有帖子要显示时运行。 我希望这对其他人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.