2016-10-22 3 views
0

У меня есть форма отправки данных для просмотра через метод POST. Моя проблема в том, что я не могу получить доступ к данным сообщения формы в deleteview. После того, как песня будет удалена, я хочу, чтобы пользователь был отправлен обратно на страницу описания альбома, к которой принадлежит песня. Мой код, как показано ниже:Django: Как использовать request.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 в post data album_id из формы, чтобы пользователь был отправлен обратно на URL-адрес альбома?

ответ

0

Реализуя свои взгляды 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} 
    ) 
+0

Просто добавляемое себя просить и это сработало! Я не тестировал ответ @ cutteeth, но я нашел, что это достаточно просто. Спасибо вам всем –

1

Вы должны переопределить 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(). Вместо того, чтобы перезвонить, вы можете сделать что-то вроде

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, чтобы получить справку о представлениях, основанного класса

Смежные вопросы