【问题标题】:How to properly delete an instance of a model in Django如何在 Django 中正确删除模型的实例
【发布时间】:2021-11-02 14:41:21
【问题描述】:

我正在尝试从我的日历中删除一个事件的实例。然后我希望 Django 在删除事件后重定向到日历页面。

在我的views.py中,我定义了一个event_delete函数:

def event_delete(request, event_id=None):
    Event.objects.get(pk=event_id).delete()
    return HttpResponseRedirect(reverse("cal:calendar"))

在我的 urls.py 中,我定义了一个要删除的 url:

from django.conf.urls import url
from . import views

app_name = "cal"
urlpatterns = [
    url(r"^index/$", views.index, name="index"),
    url(r"^calendar/$", views.CalendarView.as_view(), name="calendar"),
    url(r"^event/new/$", views.event, name="event_new"),
    url(r"^event/edit/(?P<event_id>\d+)/$", views.event, name="event_edit"),
    url(r"^event/delete/$", views.event_delete, name="event_delete"),
]

在我的 event.html 中,我定义了一个接受 event_delete 的标签:

<a class="btn cancel-button buttons login_btn" href="{% url 'cal:event_delete' %}" value="Delete" style="font-family:Optima;">Delete Event</a>

当我尝试删除活动时,它会将我重定向回日历页面,但我仍然可以看到该活动。如果我再试一次,它会给我错误

DoesNotExist at /event/delete/
Event matching query does not exist.

但是,当我签入我的管理员时,我仍然看到该事件的实例。请建议我如何解决这个问题。

编辑:这就是我的 event.html 的样子:

{% extends 'cal/base.html' %}

{% block title %}
Event
{% endblock %}

{% block content %}


<!--<div class="clearfix">
  <a class="btn btn-info left" href="{% url 'cal:calendar' %}"> Calendar </a>
</div>-->
{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                {{ field.label }} <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            {{ field.label }} <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}
<div class="container h-100">
  <div class="d-flex justify-content-center h-100">
    <div class="user_card">
      <div class="d-flex justify-content-center">
        <h3 id="form-title">Add Event</h3>
      </div>
      <div class="d-flex justify-content-center form_container">
        <form method="POST" action="">
          {% csrf_token %}
          <div class="input-group mb-3">
            {{ form.title }}
          </div>

          <div class="mb-3 description">
            {{ form.description }}
          </div>
          <div class="start_and_end_time">
            <span class="timelabel">Start</span>
            {{ form.start_time }}
            <span class="spacer"></span>
            <span class="timelabel">End</span>
            {{ form.end_time }}
          </div>
          <div class="d-flex justify-content-center mt-3 login_container">
            <a class="btn cancel-button buttons login_btn" href="{% url 'cal:calendar' %}" value="Cancel" style="font-family:Optima;">Cancel</a>
            <a class="btn cancel-button buttons login_btn" href="{% url 'cal:event_delete' form.id%}" value="Delete" style="font-family:Optima;">Delete Event</a>
            <span class="spacer"></span>
            <input class="btn buttons add-button login_btn" type="submit" value="Add Event" style="font-family:Optima;">
          </div>
        </form>

      </div>
    </div>
  </div>
</div>

{% endblock %}

【问题讨论】:

标签: python-3.x django


【解决方案1】:
href="{% url 'cal:event_delete' %}"

在这里,您没有提供要删除的事件的 ID,因此它无法正常工作。更改为以下内容:

href="{% url 'cal:event_delete' form.instance %}"

第二个问题是在您的 urls.py 中,删除 URL 应该提供一个 ID,以便知道要删除什么。只需遵循类似于 edit URL 的模式:

    url(r"^event/delete/(?P<event_id>\d+)/$", views.event_delete, name="event_delete"),

【讨论】:

  • 我已更新我的问题以包含我的 event.html。我想既然我正在填写表格,我会做 form.id 还是 form.instance.id?但即使我尝试这样做,我现在也收到此错误:NoReverseMatch at /event/new/ Reverse for 'event_delete' with arguments '('',)' not found。尝试了 1 种模式:['event/delete/$']
  • @SatyenSingh 答案已编辑。您的 urls.py 中还有一个我一开始没有看到的问题。
  • 感谢您的帮助!所以这帮助我删除了一次事件,但是当我尝试创建一个新事件时,它说 event/new/ 的反向匹配不正确
  • NoReverseMatch at /event/new/ Reverse for 'event_delete' with arguments '(None,)' 未找到。尝试了 1 种模式:['event/delete/(?P\\d+)/$']
  • 我知道你说的是有效的,因为当我删除已经创建的事件时,它实际上被删除了,我检查了我的管理员,它只是那个我无法弄清楚的新错误.. .
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 2010-12-21
  • 2016-12-12
  • 2016-03-18
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多