ListView中的get_queryset函数内部没有Post Request

时间:2018-04-27 05:48:12

标签: django post methods

在ListView中,我可以轻松使用 def post(self,request)方法从列表视图发出帖子请求。但我想从 def get_queryset(self)发出帖子请求,但我还无法做到。当我尝试这样做时,它会显示" 方法405不允许!"即使post方法允许通过 http_method_names

如何在 get_queryset 功能中访问POST请求?

class ZonListView(SearchMixin, SingleTableMixin, ListView):
    template_name = 'cadmin/list.html'
    model = Zon
    table_class = ZonTable
    search_fields = {
        'title': 'icontains',
        'description': 'icontains',
    }

def post(self, request):  # ***** this one works! ******
    try:
        toggle_status = request.POST.get('toggle-status')
        pk = int(request.POST.get('pk'))
        ....
    return HttpResponseRedirect(reverse('cadmin:zon_list'))

def get_queryset(self):
    qs = super(ZonListView, self).get_queryset()

    if self.request.POST:   #*****  Not working. 405 Error *****#
        try:
            toggle_status = self.request.POST.get('toggle-status')
            pk = int(self.request.POST.get('pk'))
            ......

    if self.request.GET:
        try:
            status = self.request.GET.get('status')
            qs = qs.filter(status=status)
        except Exception:
            pass

    return qs.distinct()

def get_context_data(self, **kwargs):
    ....

1 个答案:

答案 0 :(得分:1)

要使方法允许,您需要实现与方法相同的函数,在您的情况下发布。因此,要在获取查询集中使用request.POST,您还需要定义post()方法,如下所示:

def post(self, request):  # ***** this method required! ******
    self.object_list = self.get_queryset() 
    return HttpResponseRedirect(reverse('cadmin:zon_list'))

def get_queryset(self):
    qs = super(ZonListView, self).get_queryset()

    if self.request.POST:   #*****  Now allowed *****#
        try:
            toggle_status = self.request.POST.get('toggle-status')
            pk = int(self.request.POST.get('pk'))
......

查看Django的View source以查看允许的方法定义方式。