2015-05-07 2 views
0

На прошлой неделе я начал кодирование с помощью Python и Django, и теперь я начинаю отчаянно беспокоиться об этом. Мне нужно работать с To-Do-List и вы хотите удалить задачу ToDo, нажав кнопку рядом с задачей. Теперь я всегда получаюNoReverse Match at Delete View

NoReverseMatch в/удалить/1

ошибка :(

delete_confirm.html:

{% extends "base_page.html" %} 

{% block title %}Confirm Todo delete{% endblock %} 

{% block content %} 
<form action="" method="post">{% csrf_token %} 
    <p>Are you sure you want to delete "{{ object }}"?</p> 
    <input type="submit" value="Confirm" /> 
</form> 

{% endblock %} 

Мои Urls.py:

from django.conf.urls import patterns, url 
from todolist import views 

urlpatterns = patterns('', 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^add', views.AddView.as_view(), name='add'), 
    url(r'^impressum', views.ImpressumView.as_view(), name='impressum'), 
    url(r'^edit/(?P<pk>\d+)$', views.UpdateView.as_view(), name='todo_edit'), 
    url(r'^delete/(?P<pk>\d+)', views.DeleteView.as_view(), name='todo_delete'), 
) 

views.py:

from django.shortcuts import render 
from django.core.urlresolvers import reverse_lazy 
from django.http import HttpResponse 
from django.views import generic 
from django.views.generic import TemplateView, ListView, CreateView, UpdateView, DeleteView 
from todolist.models import Todo 

# Create your views here. 
class IndexView(ListView): 
    template_name = 'index.html' 
    model = Todo 

class ImpressumView(TemplateView): 
    template_name = 'impressum.html' 

class AddView(CreateView): 
    template_name = 'add.html' 
    model = Todo 
    fields = ['title','deadline','progress'] 
    success_url = '/' 

class UpdateView(UpdateView): 
    template_name = 'edit.html' 
    model = Todo 
    fields = ['title','deadline','progress'] 
    success_url = '/' 

class DeleteView(DeleteView): 
    template_name = 'delete_confirm.html' 
    model = Todo 
    success_url = reverse_lazy('/') 

Интересная часть index.html:

<!--Table content--> 
      {% for todo in object_list %} 
      <tr> 
       <td class="text-left">{{todo.title}}</td> 
       <td> {{todo.deadline}}</td> 
       <td> 
       <div class="progress"> 
        <div class="progress-bar" role="progressbar" aria-valuenow="{{todo.progress}}" aria-valuemin="0" aria-valuemax="100" style="width: {{todo.progress}}%"> 
        {{todo.progress}}% 
        </div> 
       </div> 
       </td> 
       <td > 
       <div class="btn-group"> 
        <a href="edit/{{todo.id}}" role="button" class="btn btn-default">Edit</a> 
        <a href="delete/{{todo.id}}" role="button" class="btn btn-default">Delete</a> 
        <button class="btn btn-default" data-toggle="tooltip" title="Done?" data-placement="right"><span class="glyphicon glyphicon-check"></button> 
       </div> 
       </td> 
      {% endfor %} 

было бы здорово, если некоторые из ваших ребят может помочь новичку :)

+0

Для будущих вопросов, просьба представить полную отслеживающий, он будет содержать полезную информацию, такую ​​как строка, на которой произошла ошибка. – Alasdair

+2

Как в стороне, было бы лучше использовать тег ['url'] (https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#url), например. '{% url 'todo_edit' todo.id%}' и '{% url 'todo_delete' todo.id%}' вместо жесткого кодирования URL-адресов и 'edit/{{todo.id}}' и 'delete/{{ todo.id}} 'в вашем шаблоне. – Alasdair

+0

, если вы не возражаете, пожалуйста, обновите свой вопрос с учетом всей полученной ошибки. – Yeo

ответ

3

Проблема это строка в вашем представлении удаления.

class DeleteView(DeleteView): 
    ... 
    success_url = reverse_lazy('/') 

Вы можете либо предоставить URL:

success_url = '/' 

или использовать reverse_lazy с именем URL-адрес, который вы хотите отменить:

success_url = reverse_lazy('index') 
+0

Отлично, он работает! :) Но не могли бы вы объяснить мне ошибку? Я получаю это очень часто, но я не нашел ни одного сайта, где это объяснялось легко. – user3560087

+0

'reverse_lazy' берет имя шаблона url, например. 'index' и возвращает URL-адрес, соответствующий ему, например. ' '/' '. Он также может принимать необязательные параметры для URL-адреса. Если Django не может найти URL-адрес, который соответствует, он вызывает исключение «NoReverseMatch». Вы получили это, потому что вы использовали 'reverse_lazy' с' '/ '' вместо '' index''. – Alasdair

+0

Спасибо за эти полезные ответы :) – user3560087

Смежные вопросы