Django删除ListView并使用DetailView作为列表对象,然后给出NoReverseMatch



PyCharm 2020.2Python 3.9Django 3.1Ubuntu 20.04 LTS

项目urls.py:

urlpatterns = [
path('', views.home, name='home'),
path('admin/doc/', include('django.contrib.admindocs.urls')),
path('admin/', admin.site.urls),
path('ktab/', include('ktab.urls')),

app.models.py:

def get_absolute_url(self):
return django.urls.reverse('EntryDetail_url', kwargs={"slug": self.slug})

app.uls.py:

path('entry/index/', views.EntryIndex.as_view(), name='EntryIndex_url'),
path('entry/list/', views.EntryList.as_view(), name='EntryList_url'),
path('entry/<slug>:<title>/', views.EntryDetail.as_view(),  name='EntryDetail_url'),

app.views.py:

class EntryIndex(ListView):
model = Entry
template_name = 'EntryList_.html'
def get_context_object_name(self, object_list):
return 'object'
def get_queryset(self):
return Entry.objects.all()
def get_context_data(self, **kwargs):
context = super(EntryIndex, self).get_context_data(**kwargs)
context['searchbox'] = SearchBox()
return context
class EntryDetail(DetailView):
model = Entry
template_name = 'EntryDetail_.html'
def get_context_data(self, **kwargs):
context = super(EntryDetail, self).get_context_data(**kwargs)
context['searchbox'] = SearchBox()
return context
class EntryList(ListView):
model = Entry
template_name = 'EntryList_.html'

错误消息:

NoReverseMatch at /ktab/entry/list/
Reverse for 'EntryDetail_url' with keyword arguments '{'slug': 'executive-summary-hattie-urls-and-views'}' not found. 1 pattern(s) tried: ['ktab/entry/(?P<slug>[^/]+):(?P<title>[^/]+)/$']

In template /home/malikarumi/Projects/lifeandtimes/chronicle/templates/base_index.html, error at line 0

当然,第0行除了DOCTYPE声明之外什么都没有。

我正在尝试调用该模型对象的索引,它与列表相同。由于我不理解,也厌倦了与之斗争的原因,它一直试图在细节模板上给我一个单一的对象。对象"executive summary hattie urls and views"恰好是queryset[0]。

你可以看到,我在urls.py中把entry/index和entry/list放在entry/之前,期望它抓住它,但它拒绝这样做

我使用的是基于类的视图。我尝试覆盖getcontextname和getqueryset,但这也没有什么区别。

在Traceback中,您可以看到,一开始它确实得到了queryset:

context 
{'entry_list': <QuerySet [<Entry: Executive Summary of "hattie urls and views">, <Entry:....

当我试图弄清楚它在做什么时,它甚至更改了对象名称:

object_list': <QuerySet [<Entry: Executive Summary of "hattie urls and views">, <Entry:...

但它总是决定第一个就窒息。这就是它的变化:

/home/malikarumi/.virtualenvs/chronic_all/lib/python3.9/site packages/django/template/base.py,

line 858, in _resolve_lookup
if callable(current):
if getattr(current, 'do_not_call_in_templates', False):
pass
elif getattr(current, 'alters_data', False):
current = context.template.engine.string_if_invalid
else:
try:  # method call (assuming no args required)
----->    current = current() … ←---- 
except TypeError:
signature = inspect.signature(current)
try:
signature.bind()
except TypeError:  # arguments *were* required
current = context.template.engine.string_if_invalid  # invalid method call
Variable    Value
bit     'get_absolute_url'
context 
[{'True': True, 'False': False, 'None': None}, {}, {}, {'paginator': None, 'page_obj': None, 'is_paginated': False, 'object_list': <QuerySet [<Entry: Executive Summary of "hattie urls and views">, <Entry:'...(remaining elements truncated)...']>, 
'view': <ktab.views.EntryList object at 0x7f612c99cb20>}]
current 
<bound method Entry.get_absolute_url of <Entry: Executive Summary of "hattie urls and views">>
self    
<Variable: 'object.get_absolute_url'>
template_name   
'EntryList_.html'

模板:

{% for object in object_list %}
<article class="blogpost">
<header>
<h2><a href="{{ object.get_absolute_url }}">{{ object.title }}</a></h2>

回溯中有这行5次

/home/malikarumi/.virtualenvs/chronic_all/lib/python3.9/site-packages/django/template/base.py,第905行,在render_annoted中"quot"渲染节点。如果debug为True,并且在呈现时,使用上下文行信息对异常进行注释它出现在模板中的位置。对于内部使用,此方法为首选直接使用渲染方法。"quot">

try:
---->         return self.render(context) … ←---
except Exception as e:
if context.template.engine.debug and not hasattr(e, 'template_debug'):
e.template_debug = context.render_context.template.get_exception_info(e, self.token)
raise
def __iter__(self):

我想这很重要,但我不知道它为什么这么做,也不知道如何撤销它

我还试着在PyCharm的base.py:上运行调试器

File "/home/malikarumi/.virtualenvs/chronic_all/lib/python3.9/site-packages/django/template/base.py", line 69, in <module>
from .exceptions import TemplateSyntaxError
ImportError: attempted relative import with no known parent package

这个项目已经有4年的历史了,当然过去也是有效的。现在我能得到的只有主页和管理员,这两个都在项目URL上,而不是应用程序上。谢谢

更新7/21/21:@ShivendraPratapKushwaha和bdbd:首先,感谢你们两位的帮助。第二,是的,Shivenra,我今天下午第一百万次重读文档时注意到了这一点。我确信这些改变有所帮助,但这并不是一个完整的解决方案。

bdbd,我想你稍后会注意到,我的g.a.u.已经在我问题的第一部分了。此外,我设法弄清楚了如何使PyCharm的调试器工作。最终,这让我意识到;object.get_absolute_url"在我的模板中,它应该是url模板标记和命名url。

你知道Django不会通知你丢失或拼写错误的模板变量吗?是的,我也是。PyCharm只能告诉我

Exception while resolving variable '%s' in template '%s'.

这有帮助吗?但它确实给了我一个很大的提示:变量"token"的停止和开始索引。这足以让我找到object.get_absolute_url并将其替换为url模板标记。

这是我学到的另一件事——我正在深入研究所有这些细节,因为找到这个是一个非常耗时的过程,也许它会在不久的将来帮助其他人。当你从管理员那里点击"查看网站"时,它会使用一个名为"快捷方式"的视图,而不是你自己的视图代码。我是从调试工具栏(ddt)得到的。所以当你这样做的时候,你并不是在拿苹果和苹果做比较。然后我决定做一些真正激进的事情:我手动输入了一个实例的正确url,结果出现了!正确地没有错误!

这是我目前的状态:

项目URL工作

该应用程序上有两种型号。如果我在应用程序上键入详细信息实例的url。模型E,它工作。如果我在应用程序上键入详细信息实例的url。模型W,它给了我一个NoReverseMatch错误,由于它所说的论点,这个错误没有多大意义。

如果我得到任一应用程序的实例。型号E或应用程序。来自管理员的Model W,我收到了一个NoReverseMatch错误,它似乎有正确的参数,所以我很困惑为什么它不能解决。

我放弃了让清单发挥作用,直到我把细节弄清楚。现在要睡觉了。。。

根据错误,绝对url与EntryDetail_url的定义不匹配。因此,要修复此问题,请更改url以正确使用slug的kwarg:

path('entry/<slug:slug>/', views.EntryDetail.as_view(),  name='EntryDetail_url'),

并在get_absolute_url中使用正确的kwargs来匹配URL kwarg:

def get_absolute_url(self):
from django.urls import reverse
return reverse('EntryDetail_url', kwargs={'slug' : self.slug})

我正在尝试调用该模型对象的索引,这与列表相同。由于我不理解,也厌倦了与之斗争的原因,它一直试图在细节模板上给我一个单一的对象。对象"executive summary hattie urls and views"恰好是queryset[0]。

它为您提供了第一个对象,但当它尝试调用其get_absolute_url时失败,因为URL kwargs中的不匹配导致了第一个错误。如果您真的希望模型对象调用索引(尽管我不清楚为什么),那么您需要更改Entryget_absolute_url以指向索引:

def get_absolute_url(self):
from django.urls import reverse
return reverse('EntryIndex_url')

好的,我已经解决了大部分问题。我从一位设计师那里买了一个引导主题,最近在整理我的模板时,我愚蠢地遵循了他的一些假设/建议。我还将get_absolute_url粘贴到模板中,因为我忘记了,而且太懒了,无法查找和使用正确的url模板标记。当我开始遇到这些问题时,我也忘记了我所做的模板工作,因为我认为它必须是"代码",而不是模板或设计东西。Django没有警告模板错误这一事实也于事无补。但是,大部分问题现在已经解决了,你们两个提出的建议很有帮助。我仍然停留在管理链接上,所以我将关闭这个问题,并发布一个关于剩余问题的新的、更有针对性的问题。谢谢

最新更新