【问题标题】:Django NoReverseMatch Error on Update and Delete Buttons更新和删除按钮上的 Django NoReverseMatch 错误
【发布时间】:2021-08-01 14:26:33
【问题描述】:

感谢您阅读我的问题,感谢您的帮助。

我编写了一个简单的 CRUD 应用程序,并使用 django-tables2 模块使我的表格看起来更漂亮、更健壮。我正在使用 django 3.2、python 3.8.5、django_tables2 2.3.4。

我可以在 home.html 页面的搜索栏中输入查询,并在 search_results.html 页面上列出从 postgresql 返回的结果。在 search_results 页面上,每个返回的行旁边都有带有编辑和删除选项的按钮,当我将鼠标悬停在更新按钮上时,它指向 localhost:8955/update/7887 的 url 或 localhost:8955/delete/7887 的删除按钮,当然最后四位数字对于返回的行是唯一的,但是当我单击更新或删除按钮时,我会收到 NoReverseMatch 错误。我不知道是什么导致编辑和删除按钮不起作用,非常感谢您的帮助和帮助。

Image with the returned results with the update and delete button

tables.py


from .models import EsgDatabase
from django.urls import reverse_lazy
from django.contrib.auth.models import User as user

class EsgListViewTable(tables.Table):


    class Meta:
        model = EsgDatabase
        template_name = "django_tables2/bootstrap-responsive.html"
        fields = ('id','role', 'hq','system','market','state','zone','arrisseachangezone','xgsystem','xgzonecode','fto','xocnoc','snowticketassignment',)
        
    if user.is_authenticated:
        edit = TemplateColumn(template_name='update.html')
        delete = TemplateColumn(template_name='delete.html')

      


应用 urls.py

from django.urls import path, include
from .views import HomePageView, SearchResultsView, EsgCreateView, EsgUpdateView, EsgDeleteView, EsgDetailView


urlpatterns = [
    path('search/', SearchResultsView.as_view(),name='search_results',),
    path('', HomePageView.as_view(), name='home'),
    path('createform/', EsgCreateView.as_view(), name='createform'),
    path('update/<int:pk>', EsgUpdateView.as_view(), name='update'),
    path('delete/<int:pk>', EsgDeleteView.as_view(), name='delete' ),
    path('details/<int:pk>', EsgDetailView.as_view(), name='details'),
   
]

views.py


from .models import EsgDatabase
from django.urls import reverse_lazy

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

from django.shortcuts import render
from django.views.generic import TemplateView, ListView, CreateView, UpdateView, DeleteView, DetailView
from django_tables2 import SingleTableView
from esgsheet.tables import EsgListViewTable

class EsgDetailView(DetailView):
    template_name = 'details.html'
    model = EsgDatabase
    table_class = EsgListViewTable
    context_object_name = 'esgdetail'

    def get_success_url(self):
        return reverse_lazy('details',kwargs={'pk':self.object.id})


class HomePageView(TemplateView):
    template_name = 'home.html'
    context_object_name = 'esghome'

@method_decorator(login_required, name='dispatch')
class EsgDeleteView(DeleteView):
    template_name = 'delete.html'
    model = EsgDatabase
    table_class = EsgListViewTable
    # success_url = reverse_lazy('home')
    context_object_name = 'deleteview'

    def get_success_url(self):
        return reverse_lazy('home',kwargs={'pk':self.object.id})

@method_decorator(login_required, name='dispatch')
class EsgUpdateView(UpdateView):
    model = EsgDatabase
    fields = '__all__'
    table_class = EsgListViewTable
    template_name = 'update.html'
    context_object_name = 'esgupdate'


    strong textdef get_success_url(self):
        return reverse_lazy('details', kwargs={'pk':self.object.id})

@method_decorator(login_required, name='dispatch')
class EsgCreateView(CreateView):
    model = EsgDatabase
    fields = '__all__'
    template_name = 'forms.html'

    def get_success_url(self):
        return reverse_lazy('details', kwargs={'pk':self.object.id})


class SearchResultsView(SingleTableView): 
    model = EsgDatabase
    table_class = EsgListViewTable
    template_name = 'search_results.html'
    SingleTableView.table_pagination = False 
    

    def get_queryset(self):
        query = self.request.GET.get('q')
        if query:
            object_list = EsgDatabase.objects.filter(
                Q(role__icontains=query) | Q(hq__icontains=query) |
                Q(system__icontains=query) | Q(market__icontains=query) |Q(state__icontains=query) |
                Q(zone__icontains=query) |Q(arrisseachangezone__icontains=query) |Q(xgsystem__icontains=query) |
                Q(xgzonecode__icontains=query) | Q(syscode__icontains=query) |Q(fto__icontains=query) |
                Q(xocnoc__icontains=query) |Q(snowticketassignment__icontains=query)
                )
        else:
            object_list = self.model.objects.none()
        return object_list


base.html

{% load django_tables2 %}
{% load static %}
<!DOCTYPE html>

<html lang="en">

 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />

    <center> 
  {% block title %}
 {% endblock title %}
</center>
  </head>
  
  <body>
   <!-- {% url 'home' as home %}
     {% if request.path != home %}
     
    <center> <br>
      <form action="{% url 'search_results' %}" method="GET">
      <input name='q' type="text" placeholder="Search ESG Database">
      </form> <br>
    </center>

    {% endif %} -->

 


   {% block content %}
   {% endblock content %}
  </body>

</html>

home.html

 {% extends 'base.html' %}
 {% block title  %}
 <h1>ESG Database</h1>
 {% endblock title  %}
 
 {% block content %}




       <center> 
           <form action="{% url 'search_results' %}" method="GET">
            <input name='q' type="text" placeholder="Search ESG Database">
            </form> 
        </center>


        
{% endblock content %}

删除.html

{% block title  %}
{% endblock title  %}
{% block content %}

<form method="POST">{% csrf_token %}
  
</form>

{% if user.is_authenticated %}

<a type="submit" class="btn btn-danger btn-sm" href="{% url 'delete' record.id %}" >Delete.html</a>




{% endif %}

{% endblock content %}


更新.html

{% extends 'base.html' %}
{% block title  %}
{% endblock title  %}
{% block content %}
        <form method="POST">
          {% csrf_token %}
          {{form.as_p}}
   
          {% if user.is_authenticated %}
    
          <a type="submit" class="btn btn-info btn-sm" href="{% url 'update' record.id %}" >Update.html</a>
          {% endif %}
        </form>
{% endblock content %}

search_results.html

{% extends 'base.html' %}
{% load render_table from django_tables2 %}
{% block title %}
<h1>ESG Database Results</h1>
{% endblock title %}

{% block content %}
{% render_table table %}


{% endblock content %}

forms.html

{% extends 'base.html' %}
{% block title  %}
<h1>Create ESG Entry</h1>
{% endblock title  %}
{% block content %}
<form method="POST" enctype="multipart/form-data">
   {% csrf_token %}
   {{form.as_p}}
   {% if user.is_authenticated %}
   <input type="submit" value="Submit">
   {% endif %}
</form>
{% endblock content %}

details.html

{% extends 'base.html' %}

{% block title  %}
<h1>Updated Detail View</h1>
{% endblock title  %}

{% block content %}

 <table class="table table-hover"> 
    <thead>
        <th>Role</th>
        <th>HQ</th>
        <th>System</th>
        <th>Market</th>
        <th>State</th>
        <th>Zone</th>
        <th>Arris/SeaChange Zone</th>
        <th>xG System</th>
        <th>xG Zone Code</th>
        <th>Syscode</th>
        <th>FTO</th>
        <th>XOC/NOC</th>
        <th>SNOW Ticket Assignment</th>

    </thead>

    <tbody>


  
      
    <tr>

    <td>{{esgdetail.role}}</td>
    <td>{{esgdetail.hq}} </td>
    <td>{{esgdetail.system}} </td>
    <td>{{esgdetail.market}} </td>
    <td>{{esgdetail.state}} </td>
    <td>{{esgdetail.zone}} </td>
    <td>{{esgdetail.arrisseachangezone}} </td>
    <td>{{esgdetail.xgsystem}} </td>
    <td>{{esgdetail.xgzonecode}} </td>
    <td> {{esgdetail.syscode}} </td>
    <td> {{esgdetail.fto}} </td>
    <td>{{esgdetail.xocnoc}} </td>
    <td> {{esgdetail.snowticketassignment}} </td>
    <!-- <td>
        <a href="{% url 'update' esgdetail.id %}">edit</a>
        <a href="{% url 'delete' esgdetail.id %}">delete</a>
       
       
    </td> -->
    </tr>

    </tbody>
</table> 



{% endblock content %}

【问题讨论】:

  • 我可以在数据库中创建新条目并读取/检索条目,但我无法更新或删除条目。这是当我单击删除按钮 ``` NoReverseMatch at /delete/7887 Reverse for 'delete' with arguments '('',)' 时错误消息的一部分。尝试了 1 种模式:['delete/(?P[0-9]+)$'] 请求方法:GET 请求 URL:10.0.0.67:8955/delete/7887 Django 版本:3.2 异常类型:NoReverseMatch 异常值:反向未找到带有参数 '('',)' 的“删除”。尝试了 1 种模式:['delete/(?P[0-9]+)$'] ```
  • 尝试将应用名称和:添加到url标签中,例如:"{% url 'search_results' %}" --> "{% url '&lt;your_app_name_here&gt;:search_results' %}"
  • @Lewis 谢谢你的建议。在 home.html 我更新为 ```
    ``` 我得到的新错误是,``` NoReverseMatch at / 'esgsheet' 不是注册的命名空间请求方法:GET 请求 URL:10.0.0.67:8955 Django 版本:3.2异常类型:NoReverseMatch 异常值:“esgsheet”不是注册的命名空间```
  • 我看到你有你的应用程序urls.py,但请你显示你的根urls.py。将在您的项目文件夹中
  • 这里是根目录的 urls.py ``` from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', include('esgsheet.urls')), ] if settings.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT ) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ```

标签: python-3.x django django-templates django-tables2


【解决方案1】:

感谢#django irc 房间的@funkybob。首先,我不得不从我的代码中删除 cmets,因为它正在被解析并抛出 NoReverseMatch 错误。其次,我必须从更新和删除视图中删除 context_object_name。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多