在 CreateView 上处理 url 个命名组

Handilng url named group on CreateView

我需要在扩展 CreateView 的基于 class 的视图中捕获来自 URL 命名组的参数。

在 URL 中,我传递模型的名称,使用一个基于 class 的视图来创建任何对象类型。

url(r'^(?P<modelname>\w+)/create/$', GenericCreate.as_view()),

查看:

class GenericCreate(CreateView):

    def __init__(self, *args, **kwargs):

        for app in ['foo', 'bar']:
            self.mdlnm_model = models.get_model(app, self.modelname)
            if self.mdlnm_model:
                break

        formcls = get_form_class(self.modelname)

        template_name = 'create/' + self.modelname + '_create.html'
        try:
            get_template(template_name)
        except TemplateDoesNotExist:
            template_name = 'create.html'

        self.form_class = formcls
        self.model = self.mdlnm_model
        self.template_name = template_name
        self.sucess_url = "/%s/" % (self.modelname,),

        super(CreateView, self).__init__(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(GenericCreate, self).get_context_data(**kwargs)

        context.update({
            'title': self.model._meta.verbose_name,
            'creation': True,
            'icon': self.modelname + '.png'
        })
        return context

如何获取 URL 命名组 'modelname' 并将其分配给 self.modelname?

与在基于 class 的视图中获取任何 URL 参数的方式相同:

self.modelname = self.kwargs['modelname']

但在 __init__ 中绝对不能这样做。该方法在任何请求出现之前就被调用,并且通常不应在 CBV 中被覆盖。您可能应该在 get_context_data.

中执行此操作