【问题标题】:Delete all task related to User删除所有与用户相关的任务
【发布时间】:2021-04-06 20:10:26
【问题描述】:

我正在创建一个待办事项应用程序。我想在登录后从 Tasklist 表中删除与特定用户相关的所有任务,但出现错误“deleteAll() missing 1 required positional argument: 'id'”。如何删除所有任务。提前致谢。

模型.py

 from django.contrib.auth.models import User

 from django.db import models

 class TaskList(models.Model):

       user = models.ForeignKey(User, on_delete=models.CASCADE)

       task = models.CharField(max_length=100, null=False, blank=False)

       complete = models.BooleanField(default=False)

       taskCreate = models.DateTimeField(auto_now=True)

Views.py

 def deleteAll(request, id):

      TaskList.objects.filter(id=request.user.tasklist_set.filter(id)).delete()

      return redirect('todolist')

HTML

 {% extends 'home.html' %}

 {% block content %}

  {%if user.is_authenticated%}

    <h2>Welcome   {{ user.get_username| title }}</h2>

    <button type="submit"><a href="{% url 'logout' %}">Logout</a></button>

    <form method="post">

     {% csrf_token %}

      <label for="task">

        <input name="task" placeholder="add today's task" id="task" required>

          <button type="submit">add</button>

      </label>
    </form>

    <form method="get" >
      {% csrf_token %}

         <div>

            {% for todo in task  %}

               {% if todo.complete %}

                <li class="list-group-item todo-completed"><h6>{{ todo.task|linebreaks}}                          </h6></li>
                {% else %}

                    <a href="{% url 'complete' todo.id%}"> <h6 class="list">{{ todo.task|linebreaks}}</h6></a>
                {% endif %}
          {% endfor %}

         <button><a href="{% url 'delete' %}"> Delete All </a></button>

        <button><a href="{% url 'deleteComplete' %}"> Delete Completed </a></button>

    </div>

    </form>

{% endif %}

{% 端块 %}

【问题讨论】:

    标签: python-3.x django postgresql


    【解决方案1】:

    模板中的第一个更改 Delete All 按钮。因为您的视图需要用户 ID。

    <button type="button"><a href="{% url 'delete' user.id %}"> Delete All </a></button>
    

    然后简化 deleteAll 函数的数据库查询。您需要过滤当前用户的所有任务。所以你可以使用user__id__exact = id:

    def deleteAll(request, id):
          TaskList.objects.filter(user__id__exact = id).delete()
          return redirect('todolist')
    

    替代解决方案: 你不需要发送身份证。因为您可以在请求参数中获取当前用户 ID。 您只需要更改过滤器:

    # view
    @login_required
    def deleteAll(request):
          TaskList.objects.filter(user = request.user).delete()
          return redirect('todolist')
    
    # In template use:
    <button type="button"><a href="{% url 'delete' %}"> Delete All </a></button>
    
    # urlpattern
    path('delete/', deleteAll, name='delete')
    

    我希望这会对你有所帮助。谢谢你。快乐编码:)

    【讨论】:

    • 如果您不介意我的查询有什么问题,您能告诉我一件事吗
    【解决方案2】:

    这是人们常犯的一个错误。 :)

    您已经定义了一个函数,该函数接受request 和一个名为id 的参数,如下所示:

     def deleteAll(request, id):
    
          TaskList.objects.filter(id=request.user.tasklist_set.filter(id)).delete()
    
          return redirect('todolist')
    

    但是您必须将参数传递给deleteAll。为此,您必须输入参数值。

    您可以通过在该行中输入{% url 'delete' %} 之后的值来实现

    &lt;a href="{% url 'delete' %}"&gt; Delete All &lt;/a&gt;

    例如: &lt;a href="{% url 'delete' **todo.id** %}"&gt; Delete All &lt;/a&gt;

    我希望这会有所帮助,如果没有,请随时发表评论并澄清问题。

    【讨论】:

    • 基本上我想在你点击删除任务时删除与特定用户相关的所有任务
    • 如果我在删除按钮中添加 todo.id 一次只能完成一个任务
    • 在这种情况下,您必须将参数输入为&lt;a href="{% url 'delete' request.user.pk %}"&gt; Delete All &lt;/a&gt;,并且视图应更改为TaskList.objects.filter(id=id).delete() 更简单的解决方案是删除参数本身并在视图中执行此操作TaskList.objects.filter(id=request.user.pk).delete() 希望它帮助。
    【解决方案3】:

    我想“id”是指用户的id,即request.user.pk

    有两个问题,或者两个解决方案:

    关于错误

    您已指定您的视图需要参数 id,因此您需要将其添加到模板中的 URL。

    def deleteAll(request, id): # <<<< "id" is specified as argument
    
    <a href="{% url 'delete' %}"> Delete All </a>  <!-- no "id" is specified -->
    

    如果您在视图中有参数,则需要在 urls.py 中指定它(您显然这样做了),然后在任何需要它的地方反转:

    <a href="{% url 'delete' id=request.user.pk %}"> Delete All </a>
    

    您需要请求模板处理器在您的模板上下文中处理请求。

    但是,您实际上不需要该 ID,因为您已经在视图中知道它。这是“其他解决方案”。

    关于身份证

    def deleteAll(request, id):
        TaskList.objects.filter(id=request.user.tasklist_set.filter(id)).delete()
        return redirect('todolist')
    

    可以改写为

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def deleteAll(request):
        TaskList.objects.filter(id=request.user.pk).delete()
        return redirect('todolist')
    

    您还需要删除 urls.py 中 url 中的 id 参数。

    【讨论】:

    • 我从 url 中删除了 id 现在它显示“失败:使用关键字参数 '{'id': 1}' 反转'delete'。尝试了 1 种模式:['deleteall$ '] "
    • 您需要从模板中删除参数。您可能在阅读其他答案后添加了它。您应该将您的模板恢复为您在问题中发布的内容。
    猜你喜欢
    • 2018-11-12
    • 2021-10-06
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2021-11-05
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多