如何在自定义小部件模板中包含内置的Django小部件模板?

8

我正在编写一个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 文件不存在。 - JPG
你实际上是想在上面写的 textarea.html 中尝试了 textfield.html,这是一个笔误吗? - Ry-
@RY 是正确的,你最初提到内置模板时打错了字,你想要的是 'textarea.html' 而不是 'textfield.html' -- 还要注意,当你包含 'textarea.html' 的主体时,你的 <div> 标签仍然是开放状态,这会导致不良结果。 - kerasbaz
退还我的悬赏金,因为我认为 Stack Overflow 社区团队不会及时处理请求,使得当前排名第一的回答仍然得分+2,尽管我已经给出了负评。 - Ry-
你可以授予我:P,因为这是与最高(非法)投票帖子类似的答案。 - JPG
虽然不会得到500个声望点,但当我有一两分钟的空闲时间时,我会查看答案并接受最好的答案。 - aviya.developer
3个回答

4

您需要在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错误。
别忘了在INSTALLED_APPS中添加django.forms,并且至少有一个APP_DIRS=True的引擎。否则,异常将继续发生。

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的templates文件夹内创建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内。
<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>

0
为什么会出现TemplateDoesNotExist错误?
原因是 Django 尝试从django/forms/widgets/目录中获取名为textfield.html的模板,但未找到。
如何在自定义控件模板中包含内置的Django小部件模板?
这里,您想要创建一个 自定义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 }}"<b>{% include "django/forms/widgets/attrs.html" %}</b>>
{% if widget.value %}{{ widget.value }}{% endif %}</textarea>

或者,您可以将<textarea>...</textarea>标签放置在<div>...</div>标签内部。

<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的一个打字错误。) - Ry-
也许 textfield.html 是一个拼写错误,因此引发了 TemplateDoesNotExist 异常。 - JPG
你能指出 {% include "django/forms/widgets/attrs.html" %} 可能会失败的情况吗?@Ry- - JPG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接