gpt4 book ai didi

Django CBV : Easy access to url parameters in get_context_data()?

转载 作者:行者123 更新时间:2023-12-01 18:30:11 25 4
gpt4 key购买 nike

据我了解,在自定义 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 的通用 View 等?我怀疑我只是在这里错过了一些极其基本的 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))

非常感谢!

最佳答案

如果传递给 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['...']

关于 Django CBV : Easy access to url parameters in get_context_data()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941969/

25 4 0