【问题标题】:How to get an argument coming from urls.py in views.py如何在views.py中获取来自urls.py的参数
【发布时间】:2018-05-11 18:41:13
【问题描述】:

所以,我目前在 Django 中使用基于类的视图,并且我的 urls.py 中有这个 url 调度程序。

urls.py

url(r'^(?P<store_domainKey>.*)/$', views.StoreDetailView.as_view(), name='detail'),

在views.py中我想得到一个来自store_domainKey的参数,如下所示。

views.py

class StoreDetailView(DetailView):
    model = Store
    template_name = 'boutique/detail.html'

    def get_queryset(self, store_domainKey):
        store = ???

我想做的是在我的get_queryset() 函数中访问store_domainKey 以在变量store 中分配值。我怎样才能做到这一点?

更新

我需要上面的原因是因为我试图将我的 FBV 更改为 CBV。通过在我的 FBV 视图中执行以下操作,我将 store_domainKey 从 urls.py 获取到 views.py。

def detail(request, store_domainKey):
    store = get_object_or_404(Store, domainKey=store_domainKey)

我只想在我的 CBV 视图中做同样的事情。但是,get_object_or404 不起作用。

它只是抛出以下错误。

TypeError at /downeast/
get_queryset() missing 1 required positional argument: 'store_domainKey'

【问题讨论】:

  • 无法理解问题,你在哪里写了最后三行?在get函数中?您可以使用 self.kwargs['store_domainKey'] 在 get_queryset() 函数中访问 store_domainKey
  • @SHIVAM 很抱歉造成混乱!最后三行的第一行是错字。我现在更新了。顺便说一句,我放了store = self.kwargs['store_domainKey'],但它抛出了get_queryset() missing 1 required positional argument: 'store_domainKey'的错误
  • 你的 get_quertset 函数应该是 def get_queryset(self): not def get_queryset(self, store_domainKey):

标签: django django-class-based-views


【解决方案1】:

使用下面的代码

class StoreDetailView(DetailView):
    model = Store
    template_name = 'boutique/detail.html'

    def get_queryset(self):
        return Store.objects.filter(domainKey=self.kwargs['store_domainKey'])

您收到错误是因为 get_queryset 不接受任何参数或关键字参数。

由于您的 url 没有任何 pk 变量,您应该重写 get_object() 方法,因为详细视图需要 url 中的 pk 参数或它可以用作 pk 的任何参数。

def get_object(self, queryset=None):
    return Store.objects.get(domainKey=self.kwargs['store_domainKey'])

【讨论】:

  • 快速提问,就像你从Store.objects.filter(domainKey=self.kwargs['store_domainKey']) 得到一个查询集一样,有没有办法获得商店的模型对象?我问这个是因为我的后续代码是基于模型对象的。所以,在get_queryset()的开头,如果我从一个模型对象而不是一个查询集开始,它会更兼容其他相关的代码。
  • s = Store.objects.filter(domainKey=self.kwargs['store_domainKey']) 它只是一个列表,可以访问s[0]、s[1]等等,但是你应该使用我的答案的第二个代码
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 2012-12-10
  • 2013-07-22
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2021-10-14
  • 2022-07-06
相关资源
最近更新 更多