【问题标题】:NoReverseMatch error while adding slug in url path在 url 路径中添加 slug 时出现 NoReverseMatch 错误
【发布时间】:2021-01-19 11:08:35
【问题描述】:

我正在 django 中构建一个博客应用程序。在预览每个按钮后的博客列表页面中,我添加了阅读更多链接以详细阅读博客。我正在尝试在博客详细信息页面中添加 slug,但它给出了 NoReverse 错误。

我收到此错误:

这是我的 blog_app 的 urls.py,我已经包含在主项目 url.py 中:

app_name = 'blog_app'

urlpatterns = [
    path('', views.BlogList.as_view(), name='blog_list'),
    path('write/', views.CreateBlog.as_view(), name='create_blog'),
    path('details/<slug:slug>/', views.blog_details, name='blog_details'),

] 

   

这是views.py:

def blog_list(request):
    return render(request, 'blog_app/blog_list.html', context={})


class BlogList(ListView):
    context_object_name = 'blogs'
    model = Blog
    template_name ='blog_app/blog_list.html'
    


class CreateBlog(LoginRequiredMixin, CreateView):
    model = Blog
    template_name = 'blog_app/create_blog.html'
    fields = ('blog_title', 'blog_content', 'blog_image')

    def form_valid(self, form):
        blog_object = form.save(commit=False)
        blog_object.author = self.request.user
        title = blog_object.blog_title
        blog_object.slug = title.replace(' ', '-') + '-' + str(uuid.uuid4())
        blog_object.save()
        return HttpResponseRedirect(reverse('index'))



def blog_details(request, slug):
    blog = Blog.objects.get(slug=slug)

    return render(request, 'blog_app/blog_details.html', context={'blog':blog})

这是models.py:

class Blog(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_author')
    blog_title = models.CharField(max_length=264, verbose_name='Assign a Title')
    slug = models.SlugField(max_length=264, unique=True)
    blog_content = models.TextField(verbose_name="What's on your Mind")
    blog_image =models.ImageField(upload_to='blog_images', verbose_name="Blog Image")
    published_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-published_date']

    def __str__(self):
        return self.blog_title

这是 blog_details.html:

{% extends 'base.html' %}

{% block title %} Blog Details {% endblock title %} 

{%block body_block %}
    <div class="row" >
        <div class="col-sm-6">
            <h2>{‌{ blog.blog_title }}</h2>
            <h4>Posted By: {‌{ blog.author }}</h4>
            <i><h6>Published On: {‌{ blog.published_date}}</h6></i>
            <i><h6>Updated On: {‌{ blog.update_date }}</h6></i>

        </div>

        <div class="col-sm-6">
            <img src="/media/{‌{ blog.blog_image }}" width="100%">
        </div>

        {‌{ blog.blog_content | linebreaks }}

    </div>
{% endblock body_block %}

这是 blog_list.html:

{% extends 'base.html' %}
{% load custom_filters %}

{% block title %} Home {% endblock title %} 

{% block body_block %}


{% for blog in blogs %}

<h2>{‌{ blog.blog_title }}</h2>
<h6><i>{‌{ blog.published_date }}</i></h6>

<div class="row">
    <div class="col-sm-4">
        <img src="/media/{‌{ blog.blog_image }}" alt="{‌{ blog.blog_title }}" width="100%">
    </div>

    <div class="col-sm-8">
        <p>
            {‌{ blog.blog_content | range_filter  | linebreaks }}
            <a href="{% url 'blog_app:blog_details' slug=blog.slug %}">Read More</a>
        </p>
        
        <h6>Posted By: <a href="">{‌{ blog.author }}</a></h6>
    </div>

</div> 

{% endfor %}

{% endblock body_block %}

这是回溯:

    Traceback (most recent call last):
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\core\handlers\base.py", line 204, in _get_response
    response = response.render()
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\response.py", line 105, in render
    self.content = self.rendered_content
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\response.py", line 83, in 
rendered_content
    return template.render(context, self._request)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\backends\django.py", line 
61, in render
    return self.template.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\loader_tags.py", line 62, 
in render
    result = block.nodelist.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\template\defaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\urls\base.py", line 87, in reverse 
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "E:\ProIde\1 - Django Developer Path\Django Blog Project\venv\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'blog_details' with keyword arguments '{'slug': "Authorities-Take-Down-World's-Largest-Illegal-Dark-Web-Marketplace-1cf46a73-4daf-4d94-8db6-faa7c559535b"}' not found. 1 pattern(s) tried: ['blog/details/(?P<slug>[-a-zA-Z0-9_]+)/$']

如何解决错误?

【问题讨论】:

  • 你的 Authorities-Take-Down-World’ s-Langest-Tllegel-Dark-Web-Marketplace-1cfasa73-4daf-4d94-Sdb6-fea7eS595356 不是 slug,sl7ug 不包含重音

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


【解决方案1】:

你的构造无效蛞蝓。蛞蝓

...Authorities-Take-Down-World's-...

不是有效的 slug,因为它在 Worlds 之间包含一个撇号 (')。

自己构造一个蛞蝓不是一个好主意。 Django 有一个slugify(…) function [Django-doc] 来构造一个 slug:

from django.utils.text import slugify
from django.urls import reverse_lazy

class CreateBlog(LoginRequiredMixin, CreateView):
    model = Blog
    template_name = 'blog_app/create_blog.html'
    fields = ('blog_title', 'blog_content', 'blog_image')
    success_url = reverse_lazy('index')

    def form_valid(self, form):
        form.instance.author = self.request.user
        title = form.cleaned_data['blog_title']
        form.instance.slug = f'{slugify(title)}-{uuid.uuid4()}'
        return super().form_valid(form)

您需要删除带有无效 slug 的记录,或使用有效 slug 更新它。

【讨论】:

  • Thnx,我已经删除了带有 (') 的标题并且它有效。但是在这种情况下如何打盹呢?
  • @tapas:如前所述,只需使用slugify 函数。这是 Django 包中的一个函数,通常应该将字符串转换为有效的 slug。请不要使用自定义文本处理。
  • @tapas:Django 会将字符串转换为authorities-take-down-worlds-...,因此它会删除无效字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多