/ / Django Reverse nicht gefunden - Django, Django-Vorlagen, Django-Ansichten

Django Reverse nicht gefunden - Django, Django-Vorlagen, Django-Ansichten

Ich möchte nur eine Ansicht von einer Funktion aufrufenVorlage, und ich habe gesehen, dass ich es mit der Umkehrfunktion tun muss. Ich möchte einen Parameter an die Ansichtsfunktion übergeben, aber ich möchte es nicht in der URL anzeigen. Ist es möglich? Hier ist mein Code und der Fehler:

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"))

Vorlage.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 %}

und der Fehler:

Reverse for "principal.views.delete_downloaded_track" with arguments "(<DownloadedTrack: DownloadedTrack object>,)" and keyword arguments "{}" not found.

Vielen Dank!!

Antworten:

2 für die Antwort № 1

Der empfohlene Weg des HTML-Standards zur Verarbeitung von Anfragen, die Daten auf dem Server ändern, ist die Verwendung einer POST-Anfrage.

{% 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 %}

Das {% csrf_token %} verhindert Cross-Site-Fälschungsanfragen durch Validierung, dass die Person, an die Sie dieses Formular senden, auch die Person ist, die es über eine POST-Anfrage zurücksendet. Rufen Sie einfach die ID in Ihrer Ansicht ab, indem Sie Folgendes verwenden:

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

Über POST gesendete Daten werden in der URL nicht angezeigt.


1 für die Antwort № 2

Wenn Sie den Parameter in Ihrer URL nicht anzeigen möchten, möchten Sie ihn wahrscheinlich als Abfrageparameter übergeben. z.B.

<host_and_path>/perfil/deleteDownloadedTrack/?track_id=<some_track_id>.

Ihre Ansicht würde also so aussehen:

def delete_downloaded_track(request):
track_id = request.GET.get("track_id")
# get track based on track_id and delete it.

und Ihre Vorlage so (vorausgesetzt, Sie übergeben die Umkehrung von delete_downloaded_track als delete_url im Vorlagenkontext):

{% 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 %}