Django通用视图DeleteView删除意外对象

埃尔金·卡汉吉罗夫(Elgin Cahangirov)

我已经为我的“相册”模型创建了DeleteView,但是现在可以正常工作了。这是我的脚本:

urls.py

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

urlpatterns = [
    url(r'^albums/create/$', views.AlbumCreateView.as_view(), name='album_create'),
    url(r'^albums/(?P<slug>[-\w]+)/update/$', views.AlbumUpdateView.as_view(), name='album_update'),
    url(r'^albums/(?P<slug>[-\w]+)/delete/$', views.AlbumDeleteView.as_view(), name='album_delete'),
    url(r'^albums/(?P<slug>[-\w]+)/$', views.AlbumDetailView.as_view(), name='album_detail'),
    url(r'^albums/$', views.AlbumListView.as_view(), name='album_index'),
    url(r'^songs/create/$', views.SongCreateView.as_view(), name='song_create'),
    url(r'songs/$', views.SongListView.as_view(), name='song_index'),
    url(r'^(?P<song_id>[0-9]+)/favorite/$', views.make_song_favorite, name='song_favorite'),
    url(r'^$', views.AllAlbumListView.as_view(), name='index'),
]

views.py

from django.views.generic import ListView, DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin

from .models import Album

class AlbumListView(LoginRequiredMixin, ListView):
    template_name = 'music/album_index.html'
    context_object_name = 'all_albums'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['album_active'] = True
        return context

    def get_queryset(self):
        queryset = Album.objects.filter(owner=self.request.user).order_by('-release_date')
        return queryset

class AlbumDeleteView(DeleteView):
    model = Album
    template_name = 'music/album_index.html'
    success_url = '/albums/'

album_index.html

{% extends "base.html" %}

{% block content %}
<div class="row">
  <div class="col-md-9">
    <h1>Your Albums</h1>
    <a class="btn btn-primary" href="{% url 'music:album_create' %}">Add Album
      <span class="oi oi-plus" title="Add New Album"></span>
    </a>
    <div class="card-columns" style="margin-top: 10px;">
      {% for album in all_albums %}
      <div class="card">
        <img class="card-img-top img-fluid" src="{{ album.logo.url }}"
             style="background-size: cover;">
        <div class="card-body">
          <h4 class="card-title">{{ album.title }}</h4>
          <h6 class="card-subtitle mb-2 text-muted">{{ album.artist }}</h6>
          <a class="btn btn-primary" href="{% url 'music:album_detail' album.slug %}">Look Inside</a>
          <a class="btn btn-primary" href="{% url 'music:album_update' album.slug %}">
            <span class="oi oi-pencil" title="Edit Album"></span>
          </a>
          <a class="btn btn-primary" href="{% url 'music:album_delete' album.slug %}"
             data-toggle="modal" data-target="#albumDeleteConfirm">
            <span class="oi oi-trash" title="Delete Album"></span>
          </a>
          <div class="modal fade" id="albumDeleteConfirm"
               tabindex="-1" role="dialog" aria-labelledby="confirmAlbumDelete">
            <div class="modal-dialog" role="document">
              <div class="modal-content">
                <div class="modal-header">
                  <h5 class="modal-title" id="confirmAlbumDelete">Remove album '{{ album.title }}'</h5>
                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>
                <div class="modal-body">
                  <p>
                    Are you sure to remove this album? Please, note that all songs
                    associated with this album will be also removed.
                  </p>
                </div>
                <div class="modal-footer">
                  **<form method="post" action="{% url 'music:album_delete' album.slug %}">{% csrf_token %}
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
                    <button type="submit" class="btn btn-primary" value="Confirm">Remove</button>
                  </form>**
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      {% endfor %}
    </div>
  </div>
  <div class="col-md-3">
  </div>
</div>
{% endblock %}

正如您在views.AlbumListView中看到的那样,我已经按发行日期对专辑进行了排序。我的问题是,当我单击“删除”按钮时,DeleteView会删除第一个专辑(即发布日期最新的专辑),而不是单击的专辑。我不知道问题出在哪里。你能帮我吗?

提前致谢!

阿拉斯代尔

Anid应该是唯一的,但id="albumDeleteConfirm"每个专辑都有一个div

使ID唯一(例如,通过添加slug或pk),并进行更新data-target

在您的中DeleteView,我不会使用与music/album_index.html列表视图相同的模板docs中有一个示例删除模板该模板将只是一个备用-如果您的模态有效,则将不会看到它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django DeleteView 不会从数据中删除对象

在Django DeleteView中获取已删除的对象

ValueError:字段“ id”应为数字,但已被“删除”“”-Django通用DeleteView

django api使用通用视图删除多个对象

从Django中的视图删除对象

通用 DeleteView 在 0x04725628 处返回 django.db.models.query_utils.DeferredAttribute 对象 - Django

Django DeleteView - 成功删除后发送邮件

从Django中的通用类视图中删除选项

Django:必须使用对象pk或slug调用通用详细视图

如何使ManyToMany字段的值显示在Django通用DeleteView中

Django编辑和删除,使用通用编辑视图或在视图中创建函数。

使用DeleteView删除模板中的对象而无需确认

使用 Django DeleteView 并在删除确认后得到 404

使用 Django DeleteView 并在删除确认后得到 404

ValueError - 没有返回 HttpResponse 对象。- 在删除视图 Django

限制对Django通用视图的访问

Django 通用视图重定向

Django 1.8 如何通过当前通用详细信息视图的 id 过滤对象

Django:通用详细视图IDView必须使用对象pk或子弹调用

Django CBV AttributeError:通用详细信息视图必须使用对象pk或子弹调用

如何使用JsonResponse将错误消息发送到Django通用DeleteView确认页面

你如何将额外的 URL 值传递给 Django 通用的 DeleteView?

Django:DeleteView + HttpResponseNotAllowed

Django 通用视图 - 来自 DetailView 实例的 ListView

调整django通用编辑视图生成的表单

在 Django 中,通用视图是如何工作的

Django:基于通用视图的“ as_view()”方法

如何要求登录Django通用视图?

django REST api通用视图的queryset属性