/ / django обратното не е намерено - django, django-templates, django-views

django обратното не е намерено - django, django-templates, django-views

Искам просто да се обадя на функция от гледна точка нашаблон и видях, че трябва да го направя с обратната функция. Искам да предам параметър на функцията за преглед, но не искам да го показвам в 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.

Благодаря!!

Отговори:

2 за отговор № 1

Препоръчителният начин от 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. Просто изтеглете идентификационния номер в изгледа си, като използвате:

if request.method == "POST":
id = request.POST.get("track_id", None)
track = Track.objects.get(id=id)

Данните, изпратени чрез POST, няма да се показват в URL адреса.


1 за отговор № 2

Ако не желаете да показвате параметъра в 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 %}