【问题标题】:Post Request not available inside get_queryset function inside ListView发布请求在 ListView 内的 get_queryset 函数内不可用
【发布时间】:2018-04-27 05:48:12
【问题描述】:

在 ListView 中,我可以轻松地使用 def post(self, request) 方法从列表视图发出帖子请求。但我想从 def get_queryset(self) 发出我还无法做到的发布请求。当我尝试这样做时,它显示“method 405 not allowed!”,即使通过 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):
    ....

【问题讨论】:

  • 可以添加错误回溯吗?
  • 虽然这不是错误。这只是我正在寻找的一个可能的功能。控制台显示:不允许的方法(POST):/admin/zon/ [27/Apr/2018 14:42:44] "POST /admin/zon/ HTTP/1.1" 405 0

标签: django post methods


【解决方案1】:

要使方法允许,您需要实现与方法名称相同的函数,请在您的情况下发布。因此,要在 get queryset 中使用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 以检查允许的方法是如何定义的。

【讨论】:

  • 我按照你的方式。不幸的是,还无法执行 self.request.POST 块。
  • 是的。仍然无法从 get_queryset 方法访问 POST 请求。
  • 我怀疑 get_queryset 方法仅在 GET 请求时执行!如果我错了,请纠正我。
  • @Ohid 哦,你说得对!您还需要从 post 方法调用 get_queryset !检查更新的答案。
  • 您好,谢谢。我发现了我的错误。有效。我放了 request.POST 而不是 self.request.POST。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多