简体   繁体   中英

Reverse for 'post_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['post/(?P<slug>[-\\w]+)/$']

Using Django 1.11 | Having this issue, I thought it was because I copied some urls and views from another project, but even after deleting, the issue reappeared. I just was trying to remove my PostImg field and add a the image field as a FileField, but got issues for not having the postImg field even after deleting the database and all migrations etc. This issue only occurs when I have no posts (not object of the model Post) in my database. I can log into admin no problem, then create a post, and then it works. I think it's because I', displaying all posts with template tags and somehow these tags can't handle it if there are no objects.

Note: I had trouble adding slugs, but I found a nice way (I will not have any duplicate blog titles). However, this issue occured even before I added slugs.

base.html

{% 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 (the page I'm trying to access)

{% 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 %}

blog/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'


blog/urls.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"),
]

models.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 of the project

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"),
]

settings.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'

If I'm misssing any files please tell me, otherwise, thank you very much for your help

I found the answer. So usually, I always used a for loop to iterate over all posts in post_list in the template. This works with {% for post in post_list %} because it only iterates when there are objects. So then I put the newest post at the top, not in a for loop, and the with statement in the template: {% with post_list|first as post %} tried to run although there was no object in the post list. Therefore, I just had to add a check if there are any posts in post_list, so the code in home.html becomes:

{% 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 %}

just adding a check {% if post_list %} around the with block to ensure it only runs when I have a post in the database to display. I hope this helps someone else.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM