在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):
....
答案 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以查看允许的方法定义方式。