【问题标题】:How to access HttpRequest from urls.py in Django如何在 Django 中从 urls.py 访问 HttpRequest
【发布时间】:2011-06-17 19:57:36
【问题描述】:

基本上,我想使用基于用户名列出对象的通用视图。现在,问题是,我该怎么做:

(r'^resources/$',
  ListView.as_view(
    queryset=Resources.objects.filter(user=request.user.username),
    ...
  )
)

虽然我找不到访问 HttpRequest(请求)对象的方法......还是我需要使用自己的视图并在那里进行所有对象选择?

【问题讨论】:

    标签: python django django-urls


    【解决方案1】:

    您可以尝试对通用视图进行子类化:

    class PublisherListView(ListView):
        def get_queryset(self):
            return Resources.objects.filter(user=self.request.user.username)
    

    那么您的 urls 条目将如下所示:

    (r'^resources/$',
      PublisherListView.as_view(
        ...
      )
    )
    

    更多关于基于类的视图中动态过滤的信息可以在这里找到:http://docs.djangoproject.com/en/dev/topics/class-based-views/#dynamic-filtering

    【讨论】:

    • 我同意。这是执行此操作的正确方法。我厌倦了 urls.py 变得难以管理。
    • 对不起,AndiDog,request 在基于类的视图中来自self。感谢您指出这一点。
    • 如果你再看看你的代码......现在self 来自哪里? ;) dispatch 方法必须被覆盖,因为这是获取请求对象的方法。像你一样将每个请求的东西放在一个类变量中是不可能的。
    【解决方案2】:

    如果你真的想直接弄乱你的 URLconf,你可以这样做:

    (r'^resources/$',
     lambda request: ListView.as_view(queryset=Resources.objects.filter(user=request.user.username), ...)(request)
    )
    

    或者通过子类化视图来访问请求:

    class MyListView(ListView):
        def dispatch(self, request, *args, **kwargs):
            self.queryset = Resources.objects.filter(user = request.user.username)
            return super(MyListView, self).dispatch(request, *args, **kwargs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2012-04-25
      相关资源
      最近更新 更多