Django 使用直通模型的NoReverseMatch

Django 使用直通模型的NoReverseMatch,django,Django,当my views.py中的代码仍然不是模板格式时,它可以正常工作 def detail(request, entity_group_id): entity_group = get_object_or_404(EntityGroup, pk=entity_group_id) # noqa entity_list = entity_group.members.order_by('name') context = { 'entity_group': entit

当my views.py中的代码仍然不是模板格式时,它可以正常工作

def detail(request, entity_group_id):
    entity_group = get_object_or_404(EntityGroup, pk=entity_group_id) # noqa
    entity_list = entity_group.members.order_by('name')
    context = {
        'entity_group': entity_group,
        'entity_list': entity_list,
    }
    return render(request, 'core/detail.html', context)
当我把它改成通用视图时,出现了一个NoReverseMatch

class DetailView(generic.DetailView):
    model = EntityGroup
    template_name = 'core/detail.html'

    def get_context_data(self, **kwargs):
        context = super(DetailView, self).get_context_data(**kwargs)
        context['entity_group'] = EntityGroup
        context['entity_list'] = EntityGroup.members
        return context
这是我的模特

class Entity(models.Model):
    name = models.CharField(max_length=30)


class EntityGroup(models.Model):
    name = models.CharField(max_length=20)
    members = models.ManyToManyField(Entity, through='Membership')

class Membership(models.Model):
    entity_group = models.ForeignKey(EntityGroup, on_delete=models.PROTECT, null=False)
    entity = models.ForeignKey(Entity, on_delete=models.PROTECT, null=False)
如何在常规视图上设置反转

这是URL.py

from django.urls import path

from . import views

app_name = 'core'
urlpatterns = [
    # # path('', views.index, name='index'),
    # path('<int:entity_group_id>/', views.detail, name='detail'),
    # path('<int:entity_group_id>/results/', views.results, name='results'),
    # path('<int:entity_group_id>/vote/', views.vote, name='vote'),
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
    path('<int:entity_group_id>/vote/', views.vote, name='vote'),
]
从django.url导入路径
从…起导入视图
应用程序名称='核心'
URL模式=[
##路径(“”,views.index,name='index'),
#路径(“/”,views.detail,name='detail'),
#路径('/results/',views.results,name='results'),
#路径('/vote/',views.vote,name='vote'),
路径(“”,views.IndexView.as_view(),name='index'),
路径('/',views.DetailView.as_view(),name='detail'),
路径('/results/',views.ResultsView.as_view(),name='results'),
路径('/vote/',views.vote,name='vote'),
]
这是请求的回溯:

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  158.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  156.                 response = response.render()

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\response.py" in render
  106.             self.content = self.rendered_content

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\response.py" in rendered_content
  83.         content = template.render(context, self._request)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render
  175.                     return self._render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\loader_tags.py" in render
  67.                 result = block.nodelist.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\defaulttags.py" in render
  447.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\urls\base.py" in reverse
  88.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
  632.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /core/2/
Exception Value: Reverse for 'vote' with arguments '(None,)' not found. 1 pattern(s) tried: ['core\\/(?P<entity_group_id>[0-9]+)\\/vote\\/$']
文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\core\handlers\exception.py”
35响应=获取响应(请求)
文件“C:\Users\acer-1\AppData\Local\Programs\Python\36\lib\site packages\django\core\handlers\base.py”位于\u get\u响应中
158response=self.process\u异常\u由\u中间件(e,请求)
文件“C:\Users\acer-1\AppData\Local\Programs\Python\36\lib\site packages\django\core\handlers\base.py”位于\u get\u响应中
156response=response.render()
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\response.py”
106self.content=自渲染内容
呈现内容中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\response.py”
83content=template.render(上下文、self.\u请求)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\backends\django.py”
61返回self.template.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
175返回self.\u呈现(上下文)
文件“C:\Users\acer-1\AppData\Local\Programs\Python\36\lib\site packages\django\template\base.py”位于\u render中
167返回self.nodelist.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
943位=节点。带注释的渲染(上下文)
render\u注释中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
910返回self.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\loader\u tags.py”
155返回编译的\u父对象。\u呈现(上下文)
文件“C:\Users\acer-1\AppData\Local\Programs\Python\36\lib\site packages\django\template\base.py”位于\u render中
167返回self.nodelist.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
943位=节点。带注释的渲染(上下文)
render\u注释中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
910返回self.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\loader\u tags.py”
67结果=block.nodelist.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
943位=节点。带注释的渲染(上下文)
render\u注释中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\base.py”
910返回self.render(上下文)
render中的文件“C:\Users\acer-1\AppData\Local\Programs\Python\Python36\lib\site packages\django\template\defaulttags.py”
447url=reverse(视图名称,args=args,kwargs=kwargs,当前应用程序=当前应用程序)
文件“C:\Users\acer-1\AppData\Local\Programs\Python36\lib\site packages\django\url\base.py”的格式相反
88将iri_返回到_uri(解析器。_使用_前缀反向_(视图,前缀,*args,**kwargs))
文件“C:\Users\acer-1\AppData\Local\Programs\Python\36\lib\site packages\django\url\resolvers.py”位于带前缀的\u reverse\u中
632提升NoReverseMatch(msg)
异常类型:NoReverseMatch at/core/2/
异常值:找不到参数为“(无,)”的“投票”的相反值。尝试了1种模式:[“核心\\/(?P[0-9]+)\\/投票\\/$”]

我有一个投票视图,它在更改模板中的详细视图之前运行良好,这就是我没有在此处发布它的原因。

在原始视图中,您显式地向模板传递了一个
EntityGroup
对象实例

entity_group = get_object_or_404(EntityGroup, pk=entity_group_id)

context = {
    'entity_group': entity_group
但是在新的
DetailView
中,您传递的是
EntityGroup
类,而不是对象实例

context['entity_group'] = EntityGroup
context['entity_group'] = self.get_object()
因此,当模板试图基于无法查找的id呈现URL时,它可能会触发
NoReverseMatch

在新的
DetailView
中,尝试传递对象实例

context['entity_group'] = EntityGroup
context['entity_group'] = self.get_object()

请发布你的
url.py
和回溯。