代码之家  ›  专栏  ›  技术社区  ›  ohid

ListView中的get\u queryset函数中的Post请求不可用

  •  1
  • ohid  · 技术社区  · 6 年前

    在ListView中,我可以轻松使用 def post(自我,请求) 方法从列表视图发出post请求。但是我想从 def get\U查询集(自身) 我还不能做到这一点。当我尝试这样做时,它显示了“ 不允许使用方法405! “即使允许通过post方法 http\u方法\u名称

    如何访问内部的POST请求 get\u查询集 作用

    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 回复  |  直到 6 年前
        1
  •  2
  •   neverwalkaloner    6 年前

    要使方法被允许,您需要实现名为与方法相同的函数,请在您的案例中发布。So使用 request.POST 在get queryset中,还需要定义 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 检查如何定义允许的方法。