Django NoReverseMatch错误。找不到关键字参数“{'slug':''}”上的Django错误

2024-10-04 01:29:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助解决这个Django错误。我已经搜索并完成了我学到的东西,但我无法破译这个问题。我正在尝试使用DetailView类显示该书的详细信息

Model.py


   from django.db import models
   from django.urls import reverse
   
   
   
  .
   
   
   class Notes(models.Model):
       note_topic = models.CharField(max_length=200, blank=False)
       note_body = models.TextField(null=True, blank=True)
       slug = models.SlugField(null=True)
       created_at = models.DateTimeField(auto_now_add=True)
       updated_at = models.DateTimeField(auto_now=True)
       
       
       def __str__(self) -> str:
           return self.note_topic
       
       def get_absolute_url(self):
            return reverse('notebooks:note-detail', kwargs={'slug' : self.slug})
    ```
   
   **view.py**

from django.utils import timezone
from django.shortcuts import render
from django.views.generic import ListView, DetailView, CreateView, 
UpdateView, DeleteView
from .models import Notes



class NotesView(ListView):
    model = Notes
    template_name = 'notes.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['notes'] = Notes.objects.all()
        return context
        
        
class NotesDetailView(DetailView):

    model = Notes
    template_name = 'note-detail.html'
    context_object_name = 'note'
    

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['time'] = timezone.now()
        return context
    
    
 ```

项目的url.py


    from django.contrib import admin
    from django.urls import path, include
    
    
    urlpatterns = [
        path('notes/', include('notebooks.urls', namespace='notes')),
        path('admin/', admin.site.urls),
       
    ]

 

笔记本/url.py


    from django.urls import path
    from .views import NotesView, NotesDetailView
    
    app_name = 'notebooks'
    
    urlpatterns = [
        path('', NotesView.as_view(), name='notes'),
        path('detail/<slug:slug>/', NotesDetailView.as_view(), 
             name='note-detail'),

   
]

note.html笔记本应用程序主页


    {% extends 'base.html' %}
    
    {% block title %} List of Notebooks {% endblock title %}
    
    {% block content %}
    
    
    <div class="col-7 mt-4">
        <div class="list-group">
            <button type="button" class="list-group-item list-group-item- 
             action active" aria- 
            current="true">
            List Of Notebooks
            </button>
        {% for item in object_list %} 
        
            <a href="{% url 'notebooks:note-detail' slug=note.slug %}"> 
            <h1>{{item.note_topic}}</h1> 
            </a> 
            <br>
            <p>{{item.note_body}}</p>
        
        {% endfor %}
        </div>
    </div>
    
    {% endblock content %}

 

note detail.html


    {% extends 'base.html' %}
    
    {% block title %} Detail of Notes {% endblock title %}
    
    {% block content %}
    
        <h1>{{ note.note_topic }}</h1>
        <p>{{ note.note_body }}</p>
        <p>Published: {{ note.created_at|date }}</p>
        <p>Date: {{ time|date }}</p>
    
    
    {% endblock content %} 

下面是完整的回溯


    Environment:
    
    
    Request Method: GET
    Request URL: http://127.0.0.1:8000/notes/
    
    Django Version: 3.2.5
    Python Version: 3.9.5
    Installed Applications:
    ['django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'notebooks']
    Installed 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']
    
    
    Template error:
    In template C:\Users\KINGSLEY\projects\webProjects\classroom\templates\base.html, error at line 8
       Reverse for 'note-detail' with keyword arguments '{'slug': ''}' not found. 1 pattern(s) tried: ['notes/detail/(?P<slug>[-a-zA-Z0-9_]+)/$']
       1 : <!DOCTYPE html>
       2 : <html lang="en">
       3 : <head>
       4 :     <meta charset="UTF-8">
       5 :     <meta http-equiv="X-UA-Compatible" content="IE=edge">
       6 :     <meta name="viewport" content="width=device-width, initial-scale=1.0">
       7 :     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet">
       8 :     <script src="https://cdn.jsdelivr.n et/npm/bootstrap@5.0.0-beta2/dist/js/bootstr ap.bundle.min.js"></script>
       9 :     <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
       10 :     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.css"/>
       11 :     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
       12 :     <title>{% block title %}{% endblock title %}</title>
       13 : </head>
       14 : <body>
       15 : 
       16 :  <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
       17 :   <div class="container-fluid">
       18 :     <a class="navbar-brand" href="#">List of Notes</a>
    
    
    Traceback (most recent call last):
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
        response = get_response(request)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\core\handlers\base.py", line 204, in _get_response
        response = response.render()
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\response.py", line 105, in render
        self.content = self.rendered_content
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\response.py", line 83, in rendered_content
        return template.render(context, self._request)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\backends\django.py", line 61, in render
        return self.template.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 170, in render
        return self._render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 162, in _render
        return self.nodelist.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 938, in render
        bit = node.render_annotated(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 905, in render_annotated
        return self.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\loader_tags.py", line 150, in render
        return compiled_parent._render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 162, in _render
        return self.nodelist.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 938, in render
        bit = node.render_annotated(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 905, in render_annotated
        return self.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\loader_tags.py", line 62, in render
        result = block.nodelist.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 938, in render
        bit = node.render_annotated(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 905, in render_annotated
        return self.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\defaulttags.py", line 211, in render
        nodelist.append(node.render_annotated(context))
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\base.py", line 905, in render_annotated
        return self.render(context)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\template\defaulttags.py", line 446, in render
        url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\urls\base.py", line 86, in reverse
        return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
      File "C:\Users\KINGSLEY\projects\webProjects\env\lib\site-packages\django\urls\resolvers.py", line 694, in _reverse_with_prefix
        raise NoReverseMatch(msg)
    
    Exception Type: NoReverseMatch at /notes/
    Exception Value: Reverse for 'note-detail' with keyword arguments '{'slug': ''}' not found. 1 pattern(s) tried: ['notes/detail/(?P<slug>[-a-zA-Z0-9_]+)/$']

我似乎不明白发生了什么事


Tags: djangoinpyenvlibcontextlinesite
2条回答

更新此行将解决所有问题:

  path('notes/', include('notebooks.urls', namespace='notebooks')),

在项目的url.py中,您应该在路径上指定namespace,以匹配笔记本中的app_nameurl.py

path('notes/', include('notebooks.urls', namespace='notebooks')),

此外,在有<a href="{% url 'notebooks:note-detail' slug=note.slug %}">的地方,它应该是<a href="{% url 'notebooks:note-detail' slug=item.slug %}">,因为这在对象列表上的循环之间。为了便于将来参考,您可以在模型对象上使用get_absolute_url。省得你头疼

例如,您可以使用:

<a href="{{ item.get_absolute_url }}">...</a>

这仍然相当于:

<a href="{% url 'notebooks:note-detail' slug=item.slug %}">...</a>

这使得工作做得更好,而且更干净,更容易阅读

相关问题 更多 >