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中的不匹配导致了第一个错误。如果您真的希望模型对象调用索引(尽管我不清楚为什么),那么您需要更改Entry
的get_absolute_url
以指向索引:
def get_absolute_url(self):
from django.urls import reverse
return reverse('EntryIndex_url')
好的,我已经解决了大部分问题。我从一位设计师那里买了一个引导主题,最近在整理我的模板时,我愚蠢地遵循了他的一些假设/建议。我还将get_absolute_url粘贴到模板中,因为我忘记了,而且太懒了,无法查找和使用正确的url模板标记。当我开始遇到这些问题时,我也忘记了我所做的模板工作,因为我认为它必须是"代码",而不是模板或设计东西。Django没有警告模板错误这一事实也于事无补。但是,大部分问题现在已经解决了,你们两个提出的建议很有帮助。我仍然停留在管理链接上,所以我将关闭这个问题,并发布一个关于剩余问题的新的、更有针对性的问题。谢谢