【问题标题】:Django call delete function with a buttonDjango用按钮调用删除功能
【发布时间】:2021-05-07 10:55:31
【问题描述】:

我正在尝试向我的项目添加删除功能。所以我可以在不使用管理页面的情况下从数据库中删除对象。

当我尝试渲染“exercise_detail.html”时出现此错误

未找到带有参数“('',)' 的“exercise_delete”的反向操作。尝试了 1 种模式:['exercise/(?P[^/]+)/delete/$']

models.py

from django.db import models


class Exercise(models.Model):
    name = models.CharField(max_length=45, unique=True, primary_key=True)
    evolution = models.CharField(max_length=8, unique=True)
    startdate = models.DateTimeField()
    enddate = models.DateTimeField()
    logo = models.BinaryField()

    def __str__(self):
        return f"Exercise: {self.name}\t Evolution: {self.evolution}"

views.py

from django.shortcuts import get_object_or_404, render, redirect
from django.http import HttpResponse
from django.http import Http404
from django.template import loader
from django.forms import ModelForm

from .models import Exercise, Units
from .forms import ExerciseForm

def exercise_delete(request, name, *args, **kwargs):
    ex_del = Exercise.objects.get(Exercise, name=name)
    if request.method == "POST":
        ex_name.delete()
        return redirect('../')

    context = {
        'ex_del': ex_del,
    }

    return render(request, 'landing.html', context)

urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.landing),
    path('newexercise/', views.new_exercise),
    path('newunit/', views.new_unit),
    # ex: unit/7th Comm/
    path('unit/<str:short_name>/', views.unit_detail),

    # ex: exercise/Cobra Gold/
    path('exercise/<str:name>/', views.exercise_detail),
    # edit exercise
    path('exercise/<str:name>/edit/', views.exercise_edit),
    # ex: delete exercise
    path('exercise/<str:name>/delete/',
         views.exercise_delete, name='exercise_delete'),
    ]

exercise_details.html

        {% extends 'base.html' %}
    
    
    
    {% block content %}
    <div class="container-fluid">  
      <nav class="navbar navbar-expand-lg navbar-light"> 
        <h3>{{ ex_name.name }}</h3>
          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" 
          aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
          </button>
        <div class="collapse navbar-collapse justify-content-end" id="navbarNavAltMarkup">
          <div class="navbar-nav">
            <a class="nav-link" href="/exercise/{{ ex_name.name }}/edit/">
              <button class="btn btn-secondary" >Edit</button>
            </a>
            <!-- Button trigger modal -->
            <a class="nav-link" data-bs-toggle="modal" data-bs-target="#exampleModal">
              <button class="btn btn-danger">Delete</button>
            </a>
            <!-- Modal -->
            <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
              <div class="modal-dialog">
                <div class="modal-content">
                  <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">Delete Exercise?</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                  </div>
                  <div class="modal-body">
                    Are you sure you want to delete this exercise
                  </div>
                  <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Dismiss</button>
                    <a href="{% url 'exercise_delete' ex_name.name %}">
                      <button type="button" class="btn btn-danger">Delete</button>
                    </a>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </nav>
    </div>
    
      <div class="row p-3">
        <h5>
          Evolution: {{ex_name.evolution}}
        </h5>
      </div>
      <div class="row p-1">
        <p5>
          Start Date: {{ex_name.startdate}}
        </p5>
      </div><div class="row p-1">
        <p5>
          End Date: {{ex_name.enddate}}
        </p5>
      </div>
    
    {% endblock %}
    
    {% block content-another %}
    <div class="row">
      <div class="col-md-4 col-sm-6 border">
        Class I
      </div>
      <div class="col-md-4 col-sm-6 border">
        Class III
      </div>
      <div class="col-md-4 col-sm-6 border">
        Class V
      </div>
    </div>
    {% endblock %}

我不确定我做错了什么,但我认为我在我的 html 文件中传递了不正确的参数。

我还用 name=name 替换了参数 exercise.name,这是我的观点,我得到了这个错误。

未找到带有关键字参数“{'name': ''}' 的“exercise_delete”的反向操作。尝试了 1 种模式:['exercise/(?P[^/]+)/delete/$']

编辑:

ex_name 在views.py 中定义

def exercise_detail(request, name, *args, **kwargs):
ex_name = get_object_or_404(name=name)
context = {
    'ex_name': ex_name
}
return render(request, 'exercise/exercise_detail.html', context)

【问题讨论】:

    标签: django django-views django-templates


    【解决方案1】:

    我认为你在这里打错了:

    def exercise_delete(request, name, *args, **kwargs):
        ex_del = get_object_or_404(Exercise, name=name)
        if request.method == "POST":
            ex_del.delete()
            return redirect('../')
    
        context = {
            'ex_del': ex_del,
        }
    
        return render(request, 'landing.html', context)
    
    <form action="{% url 'exercise_delete' name=ex_name.name %}" method="POST">
        {% csrf_token %}
        <input type="submit" value="Delete exercise">
    </form>
    

    【讨论】:

    • 我建议你使用pk而不是name
    • 我用 get_object_or_404 替换了 Exercise.objects.get,我得到这个错误 Reverse for 'exercise_delete' with arguments '('',)' not found。尝试了 1 种模式:['exercise/(?P[^/]+)/delete/$'] 我可能应该提到我之前尝试过 get_object_or_404。
    • 在这里,在 file.html 中,您将您的实例称为练习? 你的实例名称是什么?
    • 它应该是:ex_name.name 而不是 Exercise.name
    • 谢谢!我将其更改为 ex_name 并删除了所有练习,但至少我正在取得进展。 NVM,我只需要锻炼/
    【解决方案2】:

    @ladhari 已经回答了我的问题,用这个替换了包含该功能的按钮

    <form action="{% url 'exercise_delete' name=ex_name.name %}" method="POST">
    {% csrf_token %}
    <input type="submit" value="Delete exercise">
    </form>
    

    并将exercise.name更改为ex_name.name

    【讨论】:

    • 谢谢!很高兴知道它解决了它
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多