【问题标题】:Django: NoReverseMatch at /home/blog/ Reverse for 'post-detail' not found. 'post-detail' is not a valid view function or pattern nameDjango: NoReverseMatch at /home/blog/ Reverse for 'post-detail' not found. 'post-detail' 不是有效的视图函数或模式名称
【发布时间】:2021-06-23 10:37:59
【问题描述】:

我一直收到这个错误,我不知道我在代码中做错了什么,我检查了所有内容,但仍然无法弄清楚。我还尝试通过 id 获取数据库中的特定 post 对象,我的意思是在我的 views.py 的 post 函数中执行类似“post = Post.objects.get(id=id)”的操作,但我遇到了同样的错误。 任何帮助将不胜感激。

这是我的models.py

from django.db import models
from django.contrib.auth import get_user_model
from django.urls import reverse


User = get_user_model()


class Author(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_pic = models.ImageField()

    def __str__(self):
        return self.user.username
    


class Category(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name
    

class Post(models.Model):
    title = models.CharField(max_length=200)
    overview = models.CharField(max_length=200)
    categories = models.ManyToManyField(Category)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    comment_count = models.IntegerField(default=0)
    views_count = models.IntegerField(default=0)
    timestamp = models.DateTimeField(auto_now_add=True)
    thumbnail = models.ImageField()
    featured = models.BooleanField(default=False)


    def __str__(self):
        return self.title

    
    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'id': self.id})
    

我的网址

from django.urls import path
from blog.views import home, blog, post


app_name = 'blog'


urlpatterns = [
    path('', home, name='home-page'),
    path('blog/', blog, name='blogs'),
    path('post/<id>/', post, name='post-detail'),
]

我的 blog.html 模板

      <div class="container">
        <div class="row">
          {% for post in queryset %}
            <div class="post col-xl-6">
              <div class="post-thumbnail">
                <a href="post.html"><img src="{{post.thumbnail.url}}" alt="..." class="img-fluid"></a>
              </div>
              <div class="post-details">
                <div class="post-meta d-flex justify-content-between">
                  <div class="category">
                  {% for cat in post.categories.all %}
                  <a href="#">{{cat}}</a>
                  {% endfor %}
                  </div>
                </div>
                <a href="{{post.get_absolute_url}}">
                  <h3 class="h4">{{post.title}}</h3>
                </a>
                <p class="text-muted">{{post.overview}}</p>
                <footer class="post-footer d-flex align-items-center">
                  <a href="#" class="author d-flex align-items-center flex-wrap">
                    <div class="avatar">
                      <img src="{{post.author.profile_pic.url}}" alt="..." class="img-fluid">
                    </div>
                    <div class="title">
                      <span>{{post.author.user.username}}</span>
                    </div>
                  </a>
                  <div class="date"><i class="icon-clock"></i>{{post.timestamp|timesince}} ago</div>
                  <div class="comments meta-last"><i class="icon-comment"></i>{{post.comment_count}}</div>
                </footer>
              </div>
            </div>
          {% endfor %}
        </div>
        <!-- Pagination -->
        <nav aria-label="Page navigation example">
          <ul class="pagination pagination-template d-flex justify-content-center">
            {% if queryset.has_previous %}
            <li class="page-item">
              <a href="?page={{queryset.previous_page_number}}" class="page-link">
                <i class="fa fa-angle-left"></i>
              </a>
            </li>
            {% endif %}
            <li class="page-item"><a href="?page={{queryset.number}}" class="page-link active">{{queryset.number}}</a></li>
            {% if queryset.has_next %}
            <li class="page-item">
              <a href="?page={{queryset.next_page_number}}" class="page-link">
                <i class="fa fa-angle-right"></i>
              </a>
            </li>
            {% endif %}
          </ul>
        </nav>
      </div>

我的意见.py

from django.shortcuts import render, redirect
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from blog.models import Post, Category
from marketing.models import Signup


def home(request):
    featured_posts = Post.objects.filter(featured=True)
    latest_posts = Post.objects.order_by('-timestamp')[:3]

    if request.method == 'POST':
        email = request.POST['email']
        new_signup = Signup()
        new_signup.email = email
        new_signup.save()

    context = {
        'featured_posts': featured_posts,
        'latest_posts': latest_posts
    }
    return render(request, 'index.html', context)


def blog(request):
    post_list = Post.objects.all()
    latest_posts = Post.objects.order_by('-timestamp')[:3]
    categories = Category.objects.all()
    paginator = Paginator(post_list, 4)
    page_number = request.GET.get('page')

    try:
        queryset = paginator.get_page(page_number)
    except PageNotAnInteger:
        queryset = paginator.get_page(1)
    except EmptyPage:
        queryset = paginator.get_page(paginator.num_pages)

    context = {
        'post_list': post_list,
        'queryset': queryset,
        'latest_posts': latest_posts,
        'categories': categories,
    }
    return render(request, 'blog.html', context)



def post(request, id):
    
    context = {}
    return render(request, 'post.html', context)

【问题讨论】:

    标签: python-3.x django django-models django-views django-templates


    【解决方案1】:

    在您的 models.py 中更改 get_absolute_url 如下。在从应用调用任何特定网址之前,您还需要包含应用名称。

    def get_absolute_url(self):
            return reverse('blog:post-detail', kwargs={'id': self.id})
    

    【讨论】:

    • 谢谢,我包含了应用名称,它可以工作
    • 亲爱的,如果这能解决问题,你应该接受回答说谢谢..How to?。如果这是解决问题的提示,那么请点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多