如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码

Posted

技术标签:

【中文标题】如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码【英文标题】:How to make class based view accept parameters from URL or hardcoded in URLconf 【发布时间】:2013-08-14 07:02:43 【问题描述】:

我正在开发一个基于类的通用视图,该视图将模型名称作为参数并处理该模型名称以获取更多参数。当我将模型名称硬编码到 URLconf 中的条目中时,它工作正常:

url(r'^generic/', ResultCreateView.as_view(model = 'SomeTask'))

基于类的视图片段:

class ResultCreateView(CreateView):
    model = None #this is here, expecting to be overwritten, because otherwise I get an error saying I can't pass in the 'model' kwarg above because 'model' is not already an attribute of the class
    def __init__(self,*args, **kwargs):
        self.model = get_model_object_from_modelname(kwargs['model'])
        self.form_class = my_custom_function_to_generate_a_formclass(self.model)
        self.template_name = self.model.template #template_name is an attribute I set on the model class
        return super(ResultCreateView,self).__init__(*args, **kwargs)

当我尝试切换到通过 url 传递模型参数时,即:

url(r'^tasks/(?P<model>\w+)$', ResultCreateView.as_view())

我的自定义 init 方法不再有效。我明白了:

ResultCreateView 缺少查询集。定义ResultCreateView.model、ResultCreateView.queryset,或者覆盖ResultCreateView.get_queryset()

我不知道“模型”参数在何处/何时从 URL 模式传递到视图类。理想情况下,我希望能够使该视图在任何一种情况下都能正常工作(URLconf 中的硬编码参数或 URL 模式中的参数),但我不知道将执行处理的代码放在哪里,以便它在正确的时间发生.放置该代码的正确位置在哪里,或者我应该使用其他方法吗?

编辑:(额外的复杂性:我需要使用以“模型”作为参数的装饰器来装饰视图。)

【问题讨论】:

【参考方案1】:

这些参数将被传递给实际的请求处理程序方法,而不是视图的__init__ 方法。所以,如果是 GET 请求:

class ResultCreateView(CreateView):
    model = None

    def get(self, request, model_name):
        self.model = get_model_object_from_modelname(model_name)
        self.form_class = my_custom_function_to_generate_a_formclass(self.model)
        self.template_name = self.model.template #template_name is an attribute I set on the model class
        return super(ResultCreateView,self).get(request, model_name)

【讨论】:

以上是关于如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码的主要内容,如果未能解决你的问题,请参考以下文章

带有参数的 Django 反向 url 到基于类的视图

基于类的视图中的可选 url 参数

Django:将其转换为 DetailView - 使用来自 URL 的两个参数的视图函数

django url如何使用问号? (基于类的视图)

Dfango 函数视图 VS 类 RedirectView。如何让类视图接受参数

Django 使用 URL 参数在基于类的视图中查询数据库