我只想从模板中调用一个视图函数,我已经看到我必须使用反向函数来完成它。我想将一个参数传递给view函数,但我不想在url中显示它。可能吗?这是我的代码和错误:
urls.py
url(r'^perfil/deleteDownloadedTrack/$','principal.views.delete_downloaded_track', name='delete_downloaded_track'),
views.py
def delete_downloaded_track(request, track):
...
return HttpResponseRedirect(reverse('profile_detail'))
template.html
{% for track in downloadedTracks %}
<tr>
<td>
{{track.name}}
</td>
<td>
<div class="botoForm" onclick="location.href='{% url "principal.views.delete_downloaded_track" track %}'"> Eliminar </div>
</td>
{% endfor %}
和错误:
Reverse for 'principal.views.delete_downloaded_track' with arguments '(<DownloadedTrack: DownloadedTrack object>,)' and keyword arguments '{}' not found.
谢谢!
答案 0 :(得分:2)
HTML标准推荐的处理任何更改服务器数据的请求的方法是使用POST请求。
{% for track in downloadedTracks %}
<tr>
<td>
{{track.name}}
</td>
<td>
<form method="POST" action="{% url principal.views.delete_downloaded_track %}" id="delete-form-{{ track.id }}">
{% csrf_token %}
<input type="hidden" name="track_id" value="{{ track.id }}" />
<div class="botoForm" onclick="document.getElementById('delete-form-{{ track.id }}').submit()"> Eliminar </div>
</form>
</td>
{% endfor %}
{% csrf_token %}
通过验证您发送此表单的人也是通过POST请求发送回来的人来阻止跨站点伪造请求。只需使用以下方法检索视图中的ID:
if request.method == 'POST':
id = request.POST.get("track_id", None)
track = Track.objects.get(id=id)
通过POST发送的数据不会显示在网址中。
答案 1 :(得分:1)
如果您不希望在URL中显示该参数,那么您可能希望将其作为查询参数传递, 例如
<host_and_path>/perfil/deleteDownloadedTrack/?track_id=<some_track_id>
。
所以你的观点看起来像这样:
def delete_downloaded_track(request):
track_id = request.GET.get('track_id')
# get track based on track_id and delete it.
和你的模板一样(假设你在模板上下文中将delete_downloaded_track反向传递为delete_url):
{% for track in downloadedTracks %}
<!-- template code -->
{% with delete_url|add:"?track_id="|add:track.id as url_with_id %}
<a href="{{url_with_id|safe}}">Delete</a>
{% endwith %}
{% endfor %}