我在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是否在某处提供了类,以便我可以在模板中使用它?
答案 0 :(得分:2)
KanriCreateView
ContextDataMixin
提供),则可以访问视图类的model
属性并获取模型的名称:{{1 }} 干杯
答案 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")