Django URL标记:获取模型ID的NoReverseMatch,即使它存在

时间:2018-05-03 19:54:14

标签: django templates variables url

今天真的让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是带有错误的模板视图。

当int ID作为参数传递并且正常工作时,

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%}标记而不是forif时阻止,它是None例如即使我这样做:

{% url 'app:post' post_id=blogposts.0.id %} it's None 

但在blogposts的{​​{1}}循环中,这些项目不是ForNone标记可以正常使用该循环块。

0 个答案:

没有答案