如何在我的自定义小部件模板中包含内置的 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>

第二种方法:我们可以将&lt;textarea&gt;...&lt;/textarea&gt;渲染成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>

或者,您可以将 &lt;div&gt;...&lt;/div&gt; 标记内的 &lt;textarea&gt;...&lt;/textarea&gt; 设置为

<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 小部件模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的自定义主题中包含自定义 js 文件?

在 Qt 中为整个小部件设置样式表

如何在 Laravel-4 中包含不同环境的自定义配置

如何在 Symfony (Twig) 中包含可重用的小部件?

如何在文本中包含一个小部件?

小部件标题未显示在我的自定义 WordPress 主题中