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

1 投票
3 回答
1858 浏览
提问于 2025-04-18 11:33

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

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

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

等等。

需要注意的是,这些是作为基类使用的类,我在项目中的views.py文件里进行子类化。

为了保持代码的简洁性,我正在为所有的创建和更新视图编写一个通用的表单模板。

对于更新视图,我可以在模板中访问到object,它是我正在更新的实例。然后我使用object.__class__.__name__(通过一个自定义过滤器)来获取类的名称(这样我可以自动生成像“添加用户”、“添加角色”等自定义按钮,让表单看起来不那么...普通。

当然,当我在CreateView中使用我的模板时,object并不存在(因为它还没有被创建),所以我的自定义按钮等就无法使用,这时我会遇到VariableDoesNotExist的异常。

Django有没有提供的相关信息,以便我可以在模板中使用?

3 个回答

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 }} 了。

请注意上面代码片段中的 _meta:第一个是用来从ModelForm访问模型,第二个是用来获取模型的详细名称。

就像国际化一样,如果你的模型使用了ugettext,如下所示,那么详细名称会在模板中自动翻译。

from django.utils.translation import ugettext_lazy as _

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

如果你在使用 ModelForm 来创建视图,这样做可能不太奏效。原因是你没有明确指定

model = MyModel

而是指定了

form_class = MyModelForm

所以你可以尝试这样做

from django.contrib.admin.utils import model_ngettext

model_ngettext(self.form_class._meta.model, 1)
2
  1. 你第一个视图的名字应该不一样,比如可以叫 KanriCreateView
  2. 你可以通过这个方式获取视图类的名字:{{ view.class.name }}。
  3. 如果你能访问到视图类(这个通常是 ContextDataMixin 默认提供的),你可以查看视图类的 model 属性,获取模型的名字:{{ view.model.__name__ }}

祝好

撰写回答