Django:如何在删除视图中使用 request.POST

Posted

技术标签:

【中文标题】Django:如何在删除视图中使用 request.POST【英文标题】:Django: How to use request.POST in a delete view 【发布时间】:2017-03-04 16:00:56 【问题描述】:

我有一个通过 POST 方法向视图发送数据的表单。我的问题是我无法在删除视图中访问表单的发布数据。删除歌曲后,我希望将用户发送回歌曲所属的专辑详细信息页面。我的代码如下所示:

表格(在album_detail.html中):

<form action="% url  'music:delete-song' pk=song.pk album_id=song.album_id %" method="POST">
    % csrf_token %
<input type="hidden" name="album_id" value=" song.album_id " />
<button type="submit" class="btn btn-danger btn-xs" role="button">Delete</button>
</form>

urls.py:

#----
app_name = 'music'
urlpatterns = [
   #----
   url(r'^album/(?P<pk>[0-9]+)/detail/$', views.AlbumDetail.as_view(), name='album-detail'),
   url(r'^song/(?P<pk>[0-9]+)/delete/(?P<album_id>[0-9]+)/$', views.SongDelete.as_view(), name='delete-song'),
]

最后是视图:

class SongDelete(DeleteView):
    model = Song
    album_id = request.POST.get('album_id')
    success_url = reverse_lazy('music:album-detail', kwargs='pk': album_id)

album_id 不能像上面那样设置。如何将album_id 设置为表单中的帖子数据album_id,以便将用户发送回专辑详细URL?

【问题讨论】:

【参考方案1】:

当然是通过实现你的观点get_success_url

def get_success_url(self):
    album_id = self.request.POST.get('album_id')  # Do something else if it's missing?
    return reverse(  # no need for lazy here
        'music:album-detail', 
         kwargs='pk': album_id
    )

【讨论】:

刚刚将 self 添加到请求中,它起作用了!我没有测试过@cutteeth 的答案,但我发现这个答案很简单。谢谢大家【参考方案2】:

你必须覆盖delete() and get_success_url()

def delete(self, request, *args, **kwargs):
    self.object = self.get_object()
    self.album = self.object.album # assuming that song have a foreignkey reference to album model 
    self.object.delete()
    success_url = self.get_success_url() 
    return HttpResponseRedirect(success_url)


def get_success_url(self):
    album = self.album    
    return reverse( 
        'music:album-detail', 
         kwargs='pk': album.id
        )

success_url is obtained from get_success_url() 方法,该方法从delete() 调用。您可以执行类似

的操作,而不是调用 reverse
def get_success_url(self):
    return `/album/details/' + str(self.album.id)

为了更简单。或者您可以在删除方法中目录提供redirect_url。

def delete(self, request, *args, **kwargs):
    self.object = self.get_object()
    self.album = self.object.album # assuming that song have a foreignkey reference to album model 
    self.object.delete()
    return HttpResponseRedirect('/album/details/' + str(self.album.id))

请参阅this link 以获取有关基于类的视图的帮助

【讨论】:

以上是关于Django:如何在删除视图中使用 request.POST的主要内容,如果未能解决你的问题,请参考以下文章

使用django时如何在ajax调用中传递request.user?

django如何全局使用变量

如何在 Django 视图中获取客户端的 IP

如何在 Django 中设置 AJAX 调用的视图/路径?

Django - 如何访问视图之外的请求对象?

如何在 django 中使用基于类的视图