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

时间:2014-06-30 09:01:34

标签: python django templates

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

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

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

N.B。这些是用作基类的类,我在整个项目中将views.py文件子类化。

为了保持DRY,我要为所有创建/更新视图编写通用表单模板。

对于更新视图,我可以访问模板中的object,这是我正在更新的实例。然后我使用object.__class__.__name__(通过自定义过滤器)获取类的名称(因此我可以自动生成自定义按钮,如"添加用户","添加角色" .etc所以表格看起来不那么......通用。

当然,当我在CreateView中使用我的模板时,object不存在(因为它尚未创建),所以我的自定义buttons.etc不起作用,我收到VariableDoesNotExist例外。

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

3 个答案:

答案 0 :(得分:2)

  1. 您的第一个视图的名称应该不同,例如KanriCreateView
  2. 您可以帮助您获取视图类的名称:{{view。 class name }}
  3. 如果您有权访问视图类(默认情况下由ContextDataMixin提供),则可以访问视图类的model属性并获取模型的名称:{{1 }}
  4. 干杯

答案 1 :(得分:0)

如果你正在为CreateView使用ModelForm,这并不是很有效。这是因为您没有指定

model = MyModel

但你要指定

form_class = MyModelForm

所以你能做的就是

from django.contrib.admin.utils import model_ngettext

model_ngettext(self.form_class._meta.model, 1)

答案 2 :(得分:0)

我提出了针对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_name }}

请在上面的代码段中标记 double _meta:第一个用于从ModelForm访问模型,第二个用于访问模型的详细名称。 / p>

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

from django.utils.translation import ugettext_lazy as _

class MyModel(models.Model):
    class Meta:
        verbose_name = _("your verbose name")