在Django CreateView中从模板访问模型名称
我在使用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
- 你第一个视图的名字应该不一样,比如可以叫
KanriCreateView
。 - 你可以通过这个方式获取视图类的名字:{{ view.class.name }}。
- 如果你能访问到视图类(这个通常是
ContextDataMixin
默认提供的),你可以查看视图类的model
属性,获取模型的名字:{{ view.model.__name__ }}
。
祝好