【问题标题】:How to use value from URL and request in Django DetailView?如何在 Django DetailView 中使用 URL 和请求中的值?
【发布时间】:2014-10-31 04:57:09
【问题描述】:

我在 django views.py 中有一个 DetailView,我希望能够将来自 url ex:localhost:8000/myapp/details/3/ 和 request.user.id 的 pk 值与 if 语句进行比较。

视图中只有以下几行代码:

class UserDetail(DetailView):
    model = Profile
    template_name = 'details.html'

任何帮助将不胜感激。

【问题讨论】:

  • 你必须覆盖 def get_context_data(self, **kwargs): 你会得到 pk = self.kwargs['pk']

标签: django url if-statement detailview


【解决方案1】:

在 DetailView 中,您可以访问 self.requestself.argsself.kwargs

参考:https://docs.djangoproject.com/en/dev/topics/class-based-views/generic-display/#dynamic-filtering

在你的 urls.py 中添加如下内容:

urlpatterns = [
    #...
    url(r'^details/(?P<pk>[0-9]+)/$', UserDetail.as_view()),
]

您的 UserDetail 现在可以通过self.kwargs['pk'] 访问request.user.id 和pk(参见上面的参考:kwargs 是基于名称的,因此您可以通过self.kwargs['name'] 访问它,而self.args 是基于位置的,所以您将通过 self.args[0]) 访问它。

如果我正确理解您的问题,您正在尝试操作 DetailView 的查询集,仅在当前登录的用户尝试访问他的页面时才返回数据。 如果这是真的,那么你应该在你的类中覆盖 get_queryset,就像这样:

def get_queryset(self):
    if self.kwargs['pk'] == self.request.user.id:
        return Profile.objects.filter(id=self.request.user.id)
    else:
        return Profile.objects.none()

【讨论】:

  • 我在 UserDetail 类中使用了以下代码,我得到一个 NameError: name 'self' is not defined...... if self.kwargs['pk'] != request.user .id: queryset = Profile.objects.none()
  • 您是否忘记将 self 传递给您的函数?像这样: def myFunction(self):
  • 我添加到我的原始答案中,检查这是否有帮助。
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 2021-04-28
  • 2015-06-08
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多