【问题标题】:Django CBV: Easy access to url parameters in get_context_data()?Django CBV:在 get_context_data() 中轻松访问 url 参数?
【发布时间】:2013-11-25 08:34:10
【问题描述】:

我了解在自定义 get_context_data() 方法中访问命名 url 参数的标准方法是通过 self.kwargs

但是,self.kwargs 语法变得笨拙,尤其是在处理大量参数时。所以,我一直在每个 get_context_data() 方法的顶部使用类似的东西——只是为了获得易于处理的局部变量:

def get_context_data(self, **kwargs):
    var1, var2, var3, var4, var5 = [self.kwargs[x] for x in ['var1', 'var2', 'var3', 'var4', 'var5']]
    # do stuff with var1, var2, ...
    # instead of self.kwargs['var1'], self.kwargs['var2'], ...

这很难看而且很痛苦,但它最终使事情变得更容易使用和阅读。

有没有一种简单的方法来清理它并将命名参数放入局部变量中?没有覆盖get() 方法、子类化Django 的通用视图等?我怀疑我只是在这里遗漏了一些非常基本的基本 python 概念。

这是调用get_context_data() 的默认get() 方法,以防在此处参考有帮助:

def get(self, request, *args, **kwargs):
    context = self.get_context_data(**kwargs)
    return self.render_to_response(context)

更新:

我的错误,调用get()方法实际上如下(泛型FormView在这种情况下被子类化)。不幸的是,传入get_context_data() 的kwargs 与self.kwargs 不同:

def get(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    return self.render_to_response(self.get_context_data(form=form))

非常感谢!

【问题讨论】:

  • 不,您没有遗漏任何基本概念。但是从字典中阅读确实会让人紧张。这就是为什么 PyPI 中有一堆包将只有 str 键的 dict 转换为具有相应命名(虚拟)属性的对象。我有时会为此目的使用dictns。不错!

标签: django django-views django-class-based-views


【解决方案1】:

如果传递给get_context_data 的kwargs 与self.kwargs 相同,您可以这样做:

def get_context_data(self, var1, var2, var3, var4, var5, **kwargs):
    # do stuff with var1, var2, ...

编辑:您可以重写 get 方法来传递 kwargs。我知道它并不优雅,但它会起作用。您可以制作一个 mixin 以在多个类中使用。

def get(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    return self.render_to_response(self.get_context_data(form=form, **kwargs))

除此之外,我真的想不出更好的方法。您的原始解决方案可能是最好的。我通常只是直接访问self.kwargs['...']

【讨论】:

  • 感谢您的回复!不幸的是,这不适用于 FormView,其中传递的 kwargs 与 self.kwargs 不同。我更新了问题。
  • 啊,那我想不出什么好办法。不过,我确实用更多的想法编辑了我的答案。抱歉,我帮不上什么忙了。
  • 别担心,感谢您的关注!您的解决方案适用于TemplateView,其中 kwargs == self.kwargs。无论如何,这整个问题只是我的一个小问题。
  • P.S.您必须同时覆盖form_invalid() get() 才能让FormView 以这种方式工作。呵呵,乱七八糟的。我想知道为什么这些方法不将 kwargs 传递给get_context_data()
  • 是的,我认为会有另一种方法可以覆盖。我觉得太麻烦了。如果我是你,我会坚持你原来的解决方案。或者创建另一个从 get_context_data 调用的方法。并将 self.kwargs 传递给该新方法。反正我通常不喜欢在get_context_data中做太多的处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多