今天真的让Django模板出现问题。直到今天,我已成功使用URL标签,暂时没有任何问题。我无法理解我的生活。在下面的代码中如果我做一个非常难看的方式将url存储为变量然后将其放在<a>
元素中,我没有遇到任何问题,它正常工作。
{% url 'app:post' post_id=recentpost.id as the_url %}
<a href="{{ the_url }}">I'm linking to {{recentpost.id }} {{the_url}}</a>
上面的渲染输出:
<a href="/post/18/">I'm linking to 18 /post/18/</a>
(我这样做是为了调试发生的事情 - 我从来没有将url存储为变量,然后将其插入到<a>
中。)
现在如果我在一个模板标签中正常进行 - 我得到一个NoReverseMatch错误:
<a href="{% url 'app:post' post_id=recentpost.id %}">TEST</a>
django.urls.exceptions.NoReverseMatch: Reverse for 'post' with keyword arguments '{'post_id': ''}' not found. 1 pattern(s) tried: ['post\\\\/(?P<post_id>[0-9]+)\\\\/$']
令人恼火的是,在模板的下方有一个相同的{% url %}
标签,解析了相同的网址,但使用了不同的帖子模型ID,唯一的区别是变量名称是“post”而不是“recentpost” “
它在异常中显示它将一个空变量传递给'post_id' - 或者recentpost.id =“” - 如果我只打印变量,则id号显示正常或者我将其存储为变量首先 - 它工作正常。
我很茫然。 Haaaaaaalp!
编辑:
{# This doesn't work either with same error #}
{% url 'app:post' recentpost.id %}
网址路径:
path('post/<int:post_id>/', views.post, name='post')
我在<a>
标记之后立即使用相同的上下文变量并成功访问变量。
这是views.py:
def post(request, **kwargs):
blogpost = BlogPost.objects.get(pk=kwargs['post_id'])
#Make sure we don't populate our lists below with the current requested post
blogposts = BlogPost.objects.filter(project=None).exclude(id=kwargs['post_id']).order_by('-date_created')
recentposts = BlogPost.objects.exclude(id=kwargs['post_id']).order_by('-date_created')[:5]
blogposts = blogposts[0:10]
kwargs.update({'blogpost':blogpost})
kwargs.update({'blogpost_list':blogposts})
kwargs.update({'recentposts_list':recentposts})
return HttpResponse(render_to_response('public_frontend/blogpost.html', kwargs, RequestContext(request)))
def dev_index(request, **kwargs):
blogposts = BlogPost.objects.filter(project=None).order_by('-date_created')
recentpost = blogposts[0]
blogposts = blogposts[1:10]
kwargs.update({'recentpost':recentpost})
kwargs.update({'blogpost_list':blogposts})
return HttpResponse(render_to_response('public_frontend/dev_index.html', kwargs, RequestContext(request)))
dev_index
是带有错误的模板视图。
blog
视图没有问题
这是我缩小的问题:
Reverse for 'post' with keyword arguments '{'post_id': ''}' not found
recentpost.id即将出现一个空白变量 - 当它不是时。
在这里工作=&gt; {% url 'app:post' post_id=recentpost.id as the_url %}
此处不起作用=&gt; {% url 'app:post' post_id=recentpost.id %}
最近的编辑:
如果我在任意for循环中包含相同的标记 - 它按预期工作。
{{recentpost}} <!-- prints "BlogPost Object (15)"
{{recentpost.id}} <!-- prints 15
{% for test in recentpost.name %}
<a href="{% url 'app:post' post_id=recentpost.id %}"></a>
{% endfor %}
Output: <a href="/post/15/"></a> (*n) number of characters in title
我也得到了完全相同的错误:
{% url 'app:post' post_id='' %}
{% url 'app:post' post_id=recentpost.id %}
将其放在with
块中时:
{{recentpost}} <!-- prints "BlogPost Object (15)"
{{recentpost.id}} <!-- prints 15
{% with test=recentpost%}
<a href="{% url 'app:post' post_id=test.id %}"></a>
{% endwith %}
Output: NoReverseMatch Error -- Reverse for 'post' with keyword arguments '{'post_id': ''}' not found.
如果放在if
标记之间也可以使用
{% if recentpost%} <a href="{% url 'app:post' post_id=recentpost.id %}"></a>{% endif %} <!-- Works with no error and returns proper url
<a href="{% url 'app:post' post_id=recentpost.id %}"></a> <!-- Does not work and returns a NoReverseMatch 404 because the `recentpost` variable is `None`
这是一个准确的错误 - 它会为网址/post/
返回404错误或NoReverseMatch - 只会返回一个网址/post/15/
- 或任何整数。
问题似乎与上下文变量recentpost
有关。它适用于{{recentpost}}
打印 - 但只要我在url标记中使用它,它就是None
- as如果模板未及时加载Object以在URL标记中使用它。
其他证据:
<a href="{% url 'app:post' post_id=recentpost|default:'NONE' %}"></a>
Output: NoReverseMatch: Reverse for 'post' with keyword arguments '{'post_id': 'NONE'}' not found.
这是预期的错误,因为/post/NONE/
将返回404错误
实际对象为None或Null,默认为空格 - 如果我用|default='NONE'
覆盖默认值,我们可以看到问题是该URL标记中的上下文中不存在的变量
我还尝试从视图中将上下文变量test_post='15'
传递给模板,并且具有完全相同的问题。
{{test_post}} <!-- output in template is 15
但
{% url 'app:post' post_id=test_post|default='NONE' %}
Output: NoReverseMatch: Reverse for 'post' with keyword arguments '{'post_id': 'NONE'}' not found.
变量肯定会传递给模板 - 与其他变量非常相似,但是当--ANY--变量被推送到{%url%}
标记而不是for
或if
时阻止,它是None
例如即使我这样做:
{% url 'app:post' post_id=blogposts.0.id %} it's None
但在blogposts
的{{1}}循环中,这些项目不是For
,None
标记可以正常使用该循环块。