Django CBV:轻松访问get_context_data()中的url参数?

时间:2013-11-12 23:17:08

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

我了解在自定义get_context_data()方法中访问已命名网址参数的标准方法是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正在被子类化)。不幸的是,传递到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))

非常感谢!

1 个答案:

答案 0 :(得分: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['...']