【问题标题】:django reverse not found找不到django反向
【发布时间】:2013-07-27 17:01:02
【问题描述】:

我只想从模板中调用视图函数,并且我已经看到我必须使用反向函数来完成它。我想将参数传递给视图函数,但我不想在 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'))

模板.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.

谢谢!!

【问题讨论】:

标签: django django-templates django-views


【解决方案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 请求发回表单的人来防止跨站点伪造请求。只需使用以下命令检索视图中的 id:

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

通过 POST 发送的数据不会显示在 url 中。

【讨论】:

    【解决方案2】:

    如果您不希望在 URL 中显示参数,那么您可能希望将其作为查询参数传递, 例如

    &lt;host_and_path&gt;/perfil/deleteDownloadedTrack/?track_id=&lt;some_track_id&gt;.

    所以你的视图应该是这样的:

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

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 2018-01-28
      • 2010-10-12
      • 2013-10-05
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      相关资源
      最近更新 更多