/ / django inversé non trouvé - django, django-templates, django-views

django reverse not found - django, django-templates, django-views

Je veux juste appeler une vue vue depuis untemplate, et j’ai vu que je devais le faire avec la fonction reverse. Je veux passer un paramètre à la fonction view, mais je ne veux pas le montrer dans l’URL. C'est possible? Voici mon code et l'erreur:

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

et l'erreur:

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

Merci!!

Réponses:

2 pour la réponse № 1

La méthode recommandée par le standard HTML pour traiter toute demande de modification de données sur le serveur consiste à utiliser une demande 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 %}

le {% csrf_token %} empêche les demandes de falsification entre sites en validant que la personne à qui vous envoyez ce formulaire est également celle qui l'envoie par le biais d'une demande POST. Il suffit de récupérer l'identifiant dans votre vue en utilisant:

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

Les données envoyées via POST ne seront pas affichées dans l'URL.


1 pour la réponse № 2

Si vous ne souhaitez pas afficher le paramètre dans votre URL, vous souhaiterez probablement le transmettre en tant que paramètre de requête. par exemple.

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

Donc, votre vue ressemblerait à ceci:

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

et votre modèle comme ceci (en supposant que vous passez à l’inverse de delete_downloaded_track sous la forme delete_url dans le contexte du modèle):

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