Django: 为什么当前URL与urls.py中的模式不匹配
我在这里找到了一些和我问题相关的提问,但没有找到能帮我解决问题的答案。我正在使用 Python 2.7.5 和 Django 1.8.dev20140627143448。
我有一个视图,它和我的数据库互动,用来删除对象,并且除了请求之外,它还需要两个参数:
def delete_data_item(request, dataclass_id, dataitem_id):
form = AddDataItemForm(request.POST)
data_set = get_object_or_404(DataClass, pk=dataclass_id)
context = {'data_set': data_set, 'form': form}
data_item = get_object_or_404(DataItem, pk=dataitem_id)
data_item.delete()
data_set.save()
return HttpResponseRedirect(reverse('detail',
args=(dataclass_id,)))
在 myapp.urls.py
文件中的 URL 看起来大概是这样的:
url(r'^(?P<dataclass_id>[0-9]+)/(?P<dataitem_id>[0-9]+)/delete_data_item/$',
views.delete_data_item, name='delete_data_item')
而我模板中与这个视图相关的部分是:
<a href="{% url 'delete_data_item' data_set.id data_item.id %}">DELETE</a>
每当我点击 DELETE
链接时,Django 告诉我请求的 URL:
http://127.0.0.1:8000/myapp/5/%7B%%20url%20'delete_data_item'%20data_set.id%20data_item.id%20%%7D
与我的 URL 模式不匹配。我缺少了什么呢?DELETE
链接所在的 URL 是 myapp/(<dataclass_id>[0-9]+)/
编辑:
我应该补充的一个细节是:
当我手动输入正确的 URL(比如:myapp/3/62/delete_data_item
)时,数据库中的项目删除和调用 reverse
都能完美工作。
完整模板代码:
`<h1>{{ data_set.name }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<ul>
{% for data_item in data_set.dataitem_set.all %}
<li>{{ data_item.log_date }}: {{ data_item }}
<ul>
<li>{{ data_item.id }}</li>
<li><a href="{% url 'delete_data_item' data_set.id
data_item.id %}">DELETE</a>
</li>
</ul>
</li>
{% endfor %}
<form action="{% url 'add_data_item' data_set.id %}" method="post">
{% csrf_token %}
<li>{{ form.as_p }}</li>
<input type="submit" value="Add data item"/>
</form>
</ul>
浏览器中的 HTML 代码:
<h1>Hours Slept</h1>
<ul>
<li>Aug. 18, 2014, 9:10 p.m.: 8 hours
<ul>
<li>8</li>
<li><a href="{% url 'delete_data_item' data_set.id
data_item.id %}">
DELETE</a>
</li>
</ul>
</li>
<li>Aug. 18, 2014, 9:11 p.m.: 1 hours
<ul>
<li>10</li>
<li><a href="{% url 'delete_data_item' data_set.id
data_item.id %}">
DELETE</a>
</li>
</ul>
</li>
<li>Aug. 21, 2014, 3:13 a.m.: 2.5 hours
<ul>
<li>60</li>
<li><a href="{% url 'delete_data_item' data_set.id
data_item.id %}">
DELETE</a>
</li>
</ul>
</li>
<form action="/lets_quantify/5/add_data_item/" method="post">
<input type='hidden' name='csrfmiddlewaretoken' value='FoDLqsbDsuTGu1LBFv3lYZvD2UBa6oUz' />
<li><p><label for="id_amount">Amount:</label> <input id="id_amount" name="amount" step="0.00001" type="number" /></p></li>
<input type="submit" value="Add data item"/>
</form>
</ul>`
2 个回答
0
你的模板没有正确显示。检查一下你的模板代码。生成的链接里有百分号(%)符号。
1
如果你发的模板代码是从实际文件中直接复制过来的,那么在网址标签中间有一个换行符,正好在 data_set.id
和 data_item.id
之间。Django 使用的解析器比较简单,它无法识别跨多行的标签,所以这根本没有被当作标签来解析。
把这个换行符去掉,问题就解决了。