Chcę tylko wywołać funckit widokowy zszablon, i widziałem, że muszę to zrobić z funkcją odwrotną.Chcę przekazać parametr do funkcji widoku, ale nie chcę go pokazać w adresie URL. Czy to możliwe? Oto mój kod i błąd:
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 %}
i błąd:
Reverse for "principal.views.delete_downloaded_track" with arguments "(<DownloadedTrack: DownloadedTrack object>,)" and keyword arguments "{}" not found.
Dzięki!!
Odpowiedzi:
2 dla odpowiedzi № 1Zalecaną metodą standardu HTML do obsługi każdego żądania zmiany danych na serwerze jest użycie żądania 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 %}
The {% csrf_token %}
zapobiega żądaniom fałszowania między witrynami poprzez sprawdzenie, czy osoba, do której wysyłasz ten formularz, jest również osobą odsyłającą żądanie POST. Po prostu pobierz identyfikator w widoku, używając:
if request.method == "POST":
id = request.POST.get("track_id", None)
track = Track.objects.get(id=id)
Dane wysyłane przez POST nie będą wyświetlane w adresie URL.
1 dla odpowiedzi nr 2
Jeśli nie chcesz wyświetlać parametru w swoim adresie URL, prawdopodobnie chcesz go przekazać jako parametr zapytania, na przykład
<host_and_path>/perfil/deleteDownloadedTrack/?track_id=<some_track_id>
.
Twój widok będzie wyglądał następująco:
def delete_downloaded_track(request):
track_id = request.GET.get("track_id")
# get track based on track_id and delete it.
i twój szablon w ten sposób (zakładając, że przechodzisz na drugą stronę delete_downloaded_track jako delete_url w kontekście szablonu):
{% 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 %}