NoReverseMatch 在/detail/3/

问题描述 投票:0回答:1

我有多个待办事项列表,每个待办事项列表都有列表项。列表项模型中有一个已完成的字段。如果列表项已由登录用户完成,当我放置一个要处理的表单时,我在详细信息页面中收到此错误。

我得到的错误是:

NoReverseMatch at /detail/3/
Reverse for 'completed_list_item' with arguments '('', '')' not found. 1 pattern(s) tried: ['completed\\-item/(?P<list_pk>[0-9]+)/(?P<item_pk>[0-9]+)/\\Z']
Request Method: GET
Request URL:    http://127.0.0.1:8000/detail/3/
Django Version: 4.1.4
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'completed_list_item' with arguments '('', '')' not found. 1 pattern(s) tried: ['completed\\-item/(?P<list_pk>[0-9]+)/(?P<item_pk>[0-9]+)/\\Z']
Exception Location: C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\resolvers.py, line 828, in _reverse_with_prefix
Raised during:  List.views.detail

回溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/detail/3/

Django Version: 4.1.4
Python Version: 3.10.7
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'List',
 'Chats',
 'django.contrib.humanize',
 'crispy_forms',
 'crispy_bootstrap5']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 '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\Fubara\Desktop\Desk\Web Dev\Django\TodoApp\Templates\detail.html, error at line 38
   Reverse for 'completed_list_item' with arguments '('', '')' not found. 1 pattern(s) tried: ['completed\\-item/(?P<list_pk>[0-9]+)/(?P<item_pk>[0-9]+)/\\Z']
   28 :             <h4 class="card-title">{{todo_list.title}}</h4>
   29 :             <p class="card-text">{{todo_list.description|linebreaksbr}}</p>
   30 :             <ul class="center list-unstyled">
   31 :                 <!-- {% comment %}{% endcomment %} -->
   32 :                 {% for item in list_items %}
   33 :                 <li>
   34 :                     <table id="table table-striped display">
   35 :                         <tbody>
   36 :                             <tr class="justify-content-between" style="font-size: 0.8rem;">
   37 :                                 <td class="col-2">
   38 :                                     <form method="POST" action=" {% url 'completed_list_item' todo_list.list_pk item.item_pk %} ">
   39 :                                         {% csrf_token %}    
   40 :                                         {% if request.user in item.completed.all %}
   41 :                                             <button type="submit" class="opacity-75 fs-5 px-0 py-0 complete-btn" id="complete-btn" title="Congrats!! You have completed {{item.item_name}}">
   42 :                                                 <i class="fa fa-check-square-o p-1 card-text" aria-hidden="true"></i>
   43 :                                             </button>
   44 :                                         {% else %}
   45 :                                             <button type="submit" class="opacity-75 fs-5 px-0 py-0 complete-btn" id="complete-btn" title="Click me if you have completed {{item.item_name}} task">
   46 :                                                 <i class="fa fa-square-o p-1 card-text" aria-hidden="true"></i>
   47 :                                             </button>
   48 :                                         {% endif %}


Traceback (most recent call last):
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\contrib\auth\decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Fubara\Desktop\Desk\Web Dev\Django\TodoApp\List\views.py", line 107, in detail
    return render(request, "detail.html", context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\shortcuts.py", line 24, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\backends\django.py", line 62, in render
    return self.template.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\defaulttags.py", line 238, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\template\defaulttags.py", line 472, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\base.py", line 88, in reverse
    return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
  File "C:\Users\Fubara\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\resolvers.py", line 828, in _reverse_with_prefix
    raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /detail/3/
Exception Value: Reverse for 'completed_list_item' with arguments '('', '')' not found. 1 pattern(s) tried: ['completed\\-item/(?P<list_pk>[0-9]+)/(?P<item_pk>[0-9]+)/\\Z']

我知道错误来自 url 中引用的主键,但我不知道到底是什么导致了错误

我的观点.py:

@login_required
def detail(request, pk):
    todo_list = TodoList.objects.get(pk = pk) 
    list_items = todo_list.list_items.filter(item_list = todo_list.pk)
    comments = Comment.objects.filter(todo_list = todo_list.pk)
    item_author = request.user
    list_item = None
    if request.method == 'POST':
        item_form = ListItemForm(request.POST)
        if item_form.is_valid:
            list_item = item_form.save(commit=False)
            list_item.item_list = todo_list
            list_item.item_author = item_author
            list_item.save()
            return redirect("detail", pk=pk)
    else:
        item_form = ListItemForm()
    context = {
        "todo_list": todo_list,
        "list_items": list_items,
        "list_item": list_item,
        "item_form": item_form,
        "comments": comments,
    }
    return render(request, "detail.html", context)


def completed_list_item(request, list_pk, item_pk):
    todo_list = TodoList.objects.get(pk = list_pk) 
    list_item = get_object_or_404(ListItem, pk = item_pk)
    completed = Completed.objects.filter(item_completed_id = list_item.pk)

    # Make sure the item to complete is part of the parent list
    if list_item.item_list != todo_list:
        return redirect("home")

    if request.method == 'POST':
        if list_item.completed.filter(id=request.user.id).exists():
            list_item.completed.remove(request.user)
        else:
            list_item.completed.add(request.user)
        return redirect('completed_list_item', pk = item_pk)
    
    context = {
        "list_item": list_item,
        "completed": completed,
    }
    return render(request, "completed-list-item.html", context)


datail.html 模板中的我的表单标签:

                                    <form method="POST" action="{% url 'completed_list_item' todo_list.list_pk item.item_pk %}">

这是 urls.py:

    path('detail/<int:pk>/', views.detail, name='detail'),
    path('completed-item/<int:list_pk>/<int:item_pk>/', views.completed_list_item, name='completed_list_item'),

python python-3.x django django-urls
1个回答
0
投票

list_item
item
没有任何分别称为
list_pk
item_pk
的属性。但是他们有一个名为
pk
的属性,它将引用他们在数据库行中的主键。您可以在网址中使用它:

{% url 'completed_list_item' todo_list.pk item.pk%}
© www.soinside.com 2019 - 2024. All rights reserved.