4

我了解在自定义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()这是调用的默认方法,get_context_data()以防在此处参考有帮助:

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

更新:

我的错误,调用get()方法实际上如下(FormView在这种情况下泛型正在被子类化)。不幸的是,传入的 kwargsget_context_data()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))

非常感谢!

4

1 回答 1

4

如果传递给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['...']直接访问。

于 2013-11-12T23:27:40.420 回答