【发布时间】: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