Python 从模板访问Django CreateView中的模型名称

Python 从模板访问Django CreateView中的模型名称,python,django,templates,Python,Django,Templates,我正在使用Django 1.6中的通用CRUD视图,例如: class KanriCreateView(CreateView): template_name = 'generic_form.html' class KanriUpdateView(UpdateView): template_name = 'generic_form.html' 等等 注意:这些类被用作基类,在整个项目中,我在views.py文件中为其子类 为了保持干燥,我正在为所有创建/更新视图编写一个通用表单

我正在使用Django 1.6中的通用CRUD视图,例如:

class KanriCreateView(CreateView):
    template_name = 'generic_form.html'

class KanriUpdateView(UpdateView):
    template_name = 'generic_form.html'
等等

注意:这些类被用作基类,在整个项目中,我在views.py文件中为其子类

为了保持干燥,我正在为所有创建/更新视图编写一个通用表单模板

对于更新视图,我可以访问模板中的
对象
,这是我正在更新的实例。然后我使用
object.\uuuuuuu class.\uuuuuu name.\uuuuuuuuu
(通过自定义过滤器)获取类的名称(这样我就可以自动生成自定义按钮,如“添加用户”、“添加角色”等,这样表单看起来就不那么通用了

当然,当我在
CreateView
中使用模板时,
object
不存在(因为它还没有被创建),因此我的自定义按钮等不起作用,我得到一个
VariableDoesNotExist
异常

Django是否提供了,以便我可以在模板中使用它

  • 第一个视图的名称应该不同,例如
    KanriCreateView
  • 它可能会帮助您获取视图类的名称:{{view.名称}
  • 如果您有权访问视图类(默认情况下由
    ContextDataMixin
    提供),则可以访问视图类的
    model
    属性,并获取模型的名称:
    {{view.model.\uuuu name\uuuu}

  • 干杯

    如果您在CreateView中使用ModelForm,那么这不太有效。这是因为您没有指定

    model = MyModel
    
    form_class = MyModelForm
    
    但是你却在指定

    model = MyModel
    
    form_class = MyModelForm
    
    所以你能做的是

    from django.contrib.admin.utils import model_ngettext
    
    model_ngettext(self.form_class._meta.model, 1)
    

    我建议为Django 2和3更新一个解决方案:从与CreateView关联的ModelForm中检索模型详细名称

    class YourCreateView(CreateView):
    
        form_class = YourModelForm
    
        def get_context_data(self, **kwargs):
            """Add the models verbose name to the context dictionary."""
    
            kwargs.update({
                "verbose_name": self.form_class._meta.model._meta.verbose_name,})
            return super().get_context_data(**kwargs)
    
    现在您可以在模板中使用
    {{verbose\u name}

    from django.utils.translation import ugettext_lazy as _
    
    class MyModel(models.Model):
        class Meta:
            verbose_name = _("your verbose name")
    
    请注意上面代码片段中的双
    \u meta
    :第一个用于从ModelForm访问模型,而第二个用于访问模型的详细名称

    与国际化一样,请注意,如果您的模型使用如下所示的ugettext,则详细名称将在模板中自动转换

    from django.utils.translation import ugettext_lazy as _
    
    class MyModel(models.Model):
        class Meta:
            verbose_name = _("your verbose name")
    

    关于1,当我在帖子中写签名时,这是一个打字错误,请放心,它不是这样写的;)。我已经修好了。否则,非常感谢。我相信这在Django 3>TemplateSyntaxError中不再可用。错误变量和属性不能以下划线开头:“view.model.\uuuu name\uuuuu”