简体   繁体   English

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

[英]Django: How to use request.POST in a delete view

I have a form sending data to a view via POST method. 我有一个通过POST方法将数据发送到视图的表单。 My problem is that I cant access the form's post data in the deleteview. 我的问题是我无法在deleteview中访问表单的发布数据。 After the song is deleted, I want the user to be sent back to the album-detail page to which the song belongs. 删除歌曲后,希望将用户发送回该歌曲所属的专辑详细页面。 My code is as shown below: 我的代码如下所示:

The form (inside album_detail.html): 形式(在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>

The urls.py: 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'),
]

And finally the view: 最后是视图:

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

The album_id can not be set as above. 无法如上所述设置album_id。 How can I set the album_id to the post data album_id from the form, so that the user is sent back to the album-detail URL? 如何从表单中将album_id设置为发布数据album_id,以便将用户发送回相册详细网址?

You Have to override delete() and get_success_url() 您必须重写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() method and that method is called from delete() . success_url is obtained from get_success_url()方法success_url is obtained from get_success_url()而该方法是从delete()调用的。 Instead of calling reverse you can do something like 除了调用反向,您可以执行以下操作

def get_success_url(self):
    return `/album/details/' + str(self.album.id)

To make it simpler. 为了使其更简单。 Or you can directory provide redirect_url in delete method. 或者,您可以在delete方法中为目录提供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))

Refer to this link to get help on class based views 请参考此链接以获取有关基于类的视图的帮助

By implementing your views get_success_url of course: 通过实现您的视图, 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}
    )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM