如何在我的自定义小部件模板中包含内置的 django 小部件模板?
Posted
技术标签:
【中文标题】如何在我的自定义小部件模板中包含内置的 django 小部件模板?【英文标题】:How do I include a built-in django widget template in my custom widget template? 【发布时间】:2020-05-22 12:45:09 【问题描述】:我正在我的应用程序中编写一个 Django 小部件。但是,由于小部件是 <textarea>
的扩展,我想在其中包含 Django Textarea 小部件:django/forms/templates/django/forms/widgets/textarea.html
。
我试过这个:
<div name=" widget.name "% include "django/forms/widgets/textfield.html" %>
% if widget.value % widget.value % endif %
</div>
但是,它导致了以下错误:
TemplateDoesNotExist at /admin/myApp/myModel/add/
我应该如何将include
语句引用到正确的模板文件?
【问题讨论】:
因为textfield.html
文件不存在。
当您实际尝试上面写的textarea.html
时,textfield.html
是不是一个错字?
@RY 是正确的,您对内置模板的原始引用是一个错字,并且您想要 'textarea.html' 而不是 'textfield.html' - 还要注意您是 当您包含“textarea.html”的主体时,标签仍处于打开状态,这会给您带来不希望的结果。
退还我的赏金,因为我认为 Stack Overflow 社区团队不会及时收到使对当前最佳答案的非法投票无效的请求,在我投反对票后仍然得分为 +2。
您可以奖励我:P,因为它是对最高(非法)投票帖子的类似答案
【参考方案1】:
您应该在 Django 的设置文件中添加此设置:
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
参考:https://docs.djangoproject.com/en/3.0/ref/forms/renderers/#templatessetting
所以 Django 能够找到内置模板文件 % include "django/forms/widgets/attrs.html" %
并且您摆脱了 TemplateDoesNotExist
错误。
【讨论】:
【参考方案2】:forms.py
from my_app.widgets import CustomTextArea
class MyForm(ModelForm):
message = forms.CharField(max_length=500,widget=CustomTextArea(attrs='cols': 10,'rows': 3,'class':'form-control'),required=True,help_text=_('The max length of the text is 500.'))
widgets.py
from django import forms
class CustomTextArea(forms.Textarea):
template_name = 'django/forms/widgets/textfield.html'
如果需要,请在my_app
的模板文件夹中创建textfield.html
,并使用正确的路径。我遵循此位置(my_app/templates/django/forms/widgets/textfield.html
)。使用此代码时必须遵循此位置。
textfield.html
第一种方法:仅显示正确的小部件而不在 html 中更改。
% include "django/forms/widgets/textarea.html" %
% if widget.value % widget.value % endif %
等于:
<textarea name=" widget.name "% include "django/forms/widgets/attrs.html" %>
% if widget.value % widget.value % endif %</textarea>
第二种方法:我们可以将<textarea>...</textarea>
渲染成div
.then,
<div>
% include "django/forms/widgets/textarea.html" %
% if widget.value % widget.value % endif %
</div>
等于:
<div>
<textarea name=" widget.name "% include "django/forms/widgets/attrs.html" %>
% if widget.value % widget.value % endif %</textarea>
</div>
【讨论】:
【参考方案3】:为什么会出现
TemplateDoesNotExist
错误?
因为 Django 试图在 django/forms/widgets/
目录中获取名为 textfield.html
的模板,但是找不到。
如何在我的自定义小部件模板中包含内置的 django 小部件模板?
在这里,您要创建一个custom django.forms.Textarea
小部件。为此,您需要继承基类,然后将 template_name
设置为其他指向自定义模板的自定义值。
# my_app/widget.py
from django import forms
class CustomTextArea(forms.Textarea):
template_name = 'my_app/widget/custom_text_area.html'
# my_app/templates/my_app/widget/custom_text_area.html
<textarea name=" widget.name "% include "django/forms/widgets/attrs.html" %>
% if widget.value % widget.value % endif %</textarea>
或者,您可以将 <div>...</div>
标记内的 <textarea>...</textarea>
设置为
<div class=" widget.name ">
<textarea name=" widget.name "% include "django/forms/widgets/attrs.html" %>
% if widget.value % widget.value % endif %</textarea>
</div>
【讨论】:
% include "django/forms/widgets/attrs.html" %
会因为同样的原因而失败。 (我认为问题中的 textfield.html 是 textarea.html 的错字。)
可能textfield.html
是一个错字,因此引发了TemplateDoesNotExist
异常。
您能否指出在哪种情况下% include "django/forms/widgets/attrs.html" %
可能会失败? @Ry-以上是关于如何在我的自定义小部件模板中包含内置的 django 小部件模板?的主要内容,如果未能解决你的问题,请参考以下文章