【问题标题】:AttributeError at /delete/1/ Generic detail view DeleteTodo must be called with either an object pk or a slug in the URLconf [duplicate]/delete/1/ 上的 AttributeError 通用详细视图 DeleteTodo 必须使用 URLconf 中的对象 pk 或 slug 调用 [重复]
【发布时间】:2021-10-28 13:51:14
【问题描述】:

我从 Django 开始,我想创建简单的项目来测试我的技能。首先是简单的待办事项列表。我在尝试在我的项目上创建“删除任务”功能时发现了一个问题。

views.py


from django.shortcuts import render, redirect
from django.urls import reverse_lazy
from .models import Task
from .forms import TaskForm
from django.views.generic import DeleteView



def index(request):
    return render(request, 'todoxd_app/index.html')

def todo(request):
    objekt = Task.objects.all()
    context = {'objekt': objekt}
    return render(request, 'todoxd_app/todo.html', context)

def new_todo(request):
    if request.method != 'POST':
        form = TaskForm()
    else:
        form = TaskForm(data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('todoxd_app/new_todo')

    context = {'form': form}
    return render(request, 'todoxd_app/new_todo.html', context)

class DeleteTodo(DeleteView):
    model = Task
    template_name = 'registration/delete_todo.html'\
urls.py 

    from django.urls import path, include
    from .views import DeleteTodo
    from . import views
    
    
    app_name = 'todoxd_app'
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('todo/', views.todo, name='todo'),
        path('new_todo/', views.new_todo, name='new_todo'),
        path('delete/<post_pk>/', DeleteTodo.as_view() ,name='delete_todo'),
    ]

delete_todo.html

标题 {% 扩展 'todoxd_app/base.html' %} {% 块内容 %} {% csrf_token %} 删除任务 {% endblock 内容 %}
   

     from django.db import models
    
    class Task(models.Model):
        name = models.CharField(max_length=50)
        description = models.TextField()
        date_added = models.DateField(auto_now_add=True)
        date_end_of_task = models.CharField(max_length=20)
        progress = models.BooleanField()
    
        def __str__(self):
            return self.name

我将不胜感激(:

【问题讨论】:

    标签: python django django-views django-urls


    【解决方案1】:

    默认情况下,像 DeleteView 这样的详细视图将在带有 kwarg pk 的 url 中查找主键,如 docs 中所述。因此,如果您想在视图中支持使用post_pk,请将其设置为pk_url_kwarg 中的值:

    class DeleteTodo(DeleteView):
        model = Task
        template_name = 'registration/delete_todo.html'
        pk_url_kwarg = 'post_pk'
    

    或者更简单的解决方法是将您的 url 配置更改为使用 pk

    path('delete/<int:pk>/', DeleteTodo.as_view(), name='delete_todo'),
    

    【讨论】:

      【解决方案2】:

      要删除任务,您必须指定 django 要删除的任务,为此您必须调用一个 id 或 slug 字段,该字段必须仅对该任务唯一,然后您可以在这里删除任务,我就是这样在这里使用 id

      def DeleteTodo(request, id):
          task = Task.objects.filter(id=id)
          task.delete()
          return render(request, 'registration/delete_todo.html')
      

      在您希望允许用户删除该任务的 html 中的 href 标记中

      <a href="{% url 'todoxd_app:delete_todo' id=task.id %}">Delete It</a>
      

      最后在你的网址中

      path('<int:id>/delete', views.DeleteTodo, name='delete_todo'),
      

      现在你可以删除它了

      【讨论】:

      • 在 url 文件中,视图不应该写 DeleteTodo.as_view() ,如果我有基于类的视图?
      • 所以你想使用基于类的视图而不是基于函数的视图,但两者都可以正常工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      相关资源
      最近更新 更多