【问题标题】:How do I include a built-in django widget template in my custom widget template?如何在我的自定义小部件模板中包含内置的 django 小部件模板?
【发布时间】: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,因为它是对最高(非法)投票帖子的类似答案

标签: python django django-forms django-templates django-admin


【解决方案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-
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签