【问题标题】:How change html template of ImageField in edit form?如何在编辑表单中更改 ImageField 的 html 模板?
【发布时间】:2018-02-05 06:42:31
【问题描述】:

我在我的项目中使用 Django 1.11。在我的编辑表单中,我有 ImageField。 Django 默认渲染 html,您可以在下面看到。如何正确修改编辑表单中ImageField的html?

我尝试了下一个代码,但 Django 引发错误 TemplateDoesNotExist。 Django 在我的自定义小部件中看不到 template_file?如何解决这个问题?顺便说一下 initial_textinput_text 效果很好。我也试过 template_with_initial 但不幸的是它没有帮助我。如果有任何帮助,我将不胜感激!

Django 默认渲染这个html

Currently:
<a href="/media/images/2017/08/23/picture.jpg">images/2017/08/23/picture.jpg</a>
Change:
<input name="image" id="id_image" type="file">

widgets.py:

from django.forms.widgets import ClearableFileInput

class CustomClearableFileInput(ClearableFileInput):
    initial_text = 'Current image'

    input_text = 'Change'

    clear_checkbox_label = 'Clear Image'

    template_name = 'custom_clearable_file_input.html' <-- DONT WORK

custom_clearable_file_input.html:

{% if widget.is_initial %}
  <span>{{ widget.initial_text }}</span>: <a href="{{ widget.value.url }}">{{ widget.value }}</a>
  {% if not widget.required %}
    <input type="checkbox" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}"/>
    <label for="{{ widget.checkbox_id }}">{{ widget.clear_checkbox_label }}</label>
  {% endif %}
  <br/>
  <span>{{ widget.input_text }}</span>:
{% endif %}
<input type="{{ widget.type }}" name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}/>

错误:

Traceback (most recent call last):
  File "/srv/envs/Project/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/nurzhan/CA/article/views.py", line 106, in get
    request=request
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/loader.py", line 68, in render_to_string
    return template.render(context, request)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/backends/django.py", line 68, in render
    reraise(exc, self.backend)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/backends/django.py", line 89, in reraise
    six.reraise(exc.__class__, new, sys.exc_info()[2])
  File "/srv/envs/Project/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/backends/django.py", line 66, in render
    return self.template.render(context)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/base.py", line 207, in render
    return self._render(context)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/base.py", line 199, in _render
    return self.nodelist.render(context)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/base.py", line 993, in render
    bits.append(force_text(bit))
  File "/srv/envs/Project/lib/python3.6/site-packages/django/utils/encoding.py", line 76, in force_text
    s = six.text_type(s)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/utils/html.py", line 385, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "/srv/envs/Project/lib/python3.6/site-packages/django/forms/boundfield.py", line 41, in __str__
    return self.as_widget()
  File "/srv/envs/Project/lib/python3.6/site-packages/django/forms/boundfield.py", line 120, in as_widget
    **kwargs
  File "/srv/envs/Project/lib/python3.6/site-packages/django/forms/widgets.py", line 221, in render
    return self._render(self.template_name, context, renderer)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/forms/widgets.py", line 226, in _render
    return mark_safe(renderer.render(template_name, context))
  File "/srv/envs/Project/lib/python3.6/site-packages/django/forms/renderers.py", line 31, in render
    template = self.get_template(template_name)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/forms/renderers.py", line 37, in get_template
    return self.engine.get_template(template_name)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/backends/django.py", line 41, in get_template
    reraise(exc, self)
  File "/srv/envs/Project/lib/python3.6/site-packages/django/template/backends/django.py", line 89, in reraise
    six.reraise(exc.__class__, new, sys.exc_info()[2])
  File "/srv/envs/kaseAdmPy362/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/srv/envs/kaseAdmPy362/lib/python3.6/site-packages/django/template/backends/django.py", line 39, in get_template
    return Template(self.engine.get_template(template_name), self)
  File "/srv/envs/kaseAdmPy362/lib/python3.6/site-packages/django/template/engine.py", line 162, in get_template
    template, origin = self.find_template(template_name)
  File "/srv/envs/kaseAdmPy362/lib/python3.6/site-packages/django/template/engine.py", line 148, in find_template
    raise TemplateDoesNotExist(name, tried=tried)
django.template.exceptions.TemplateDoesNotExist: custom_clearable_file_input.html
[24/Aug/2017 11:02:30] "GET /administration/article/47/edit/ HTTP/1.1" 500 

【问题讨论】:

    标签: python django python-3.x django-widget django-1.11


    【解决方案1】:

    这取决于您的自定义模板文件的存储路径。

    form rendering documentations中所述:

    Django 的表单小部件是使用 Django 的模板引擎系统呈现的。

    表单模板的呈现由... DjangoTemplates 控制 [渲染器类]。

    [DjangoTemplates] 渲染器使用独立的 DjangoTemplates 引擎 (未连接到您可能在模板中配置的内容 环境)。它首先从内置的表单模板加载模板 django/forms/templates 中的目录,然后从已安装的应用程序中 使用 app_directories 加载器的模板目录。

    如果您想通过您的自定义来呈现模板 TEMPLATES 设置,例如上下文处理器,使用 模板设置渲染器。

    你有两个选择:

    1. 在您的 (app_name) 文件夹中创建一个 templates 子目录,并将您的模板文件放在此文件夹中。 (/app_name/templates/custom_clearable_file_input.html)

    2. 您可以将模板文件保留在您的 settings.py 文件 (/templates/custom_clearable_file_input.html) 的 TEMPLATES['DIRS'] 参数中指定的全局 templates 文件夹中,但您必须使用 TemplatesSettings documentation 中指定的 TemplatesSetting 渲染器 (I为settings.py文件添加了一个自定义示例)

      import django
      ...
      INSTALLED_APPS = [
          ...
          'django.forms'
          ...
      ]
      ...
      TEMPLATES = [
          {
              ...
              'DIRS': [
                  'templates',
                  django.__path__[0] + '/forms/templates',
              ],
              'APP_DIRS': True,
      
              ...
          },
      ]
      ...
      FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
      

    【讨论】:

    • 您好!谢谢您的回答。我将自定义模板存储在项目顶层的“模板”文件夹中。在 settings.py 我写了我的“模板”文件夹的路径。你能告诉我一些小例子吗?我有点困惑。
    • 我的自定义小部件文件位于 (app_name) 文件夹中。路径:app_name&gt;widgets.py.
    • 谢谢!您的第一个选项效果很好!但我想尝试第二个,因为我认为将所有模板存储在一个文件夹中的一个地方会更好。在我的settings.py 文件中,我为TEMPLATES 指定了下一个代码:'DIRS': [os.path.join(BASE_DIR, 'templates')],。我对TemplatesSetting 有点困惑。或者更精确的设置。我需要添加哪些设置?
    • 在那个链接中,在TemplatesSetting 中,我不会用import django django.__path__[0] + '/forms/templates' 之类的代码来理解第二部分。我需要在那个地方写什么?
    • 好吧,我终于找到了解决方案。在settings.py 中您需要添加此代码:FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' 并在INSTALLED_APPS 中添加'django.forms', 。在那个小部件工作之后。就这样。感谢您的建议和帮助!祝你今天过得愉快! =)
    猜你喜欢
    • 2020-04-17
    • 2021-12-24
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多