如何使用基于Django 1.11模板的表单呈现将CSS类添加到窗口小部件/字段

Gre*_*ica 7 css python django django-templates django-widget

注意:这个问题不应该与之前类似但在Django 1.11发布基于模板的表单呈现之前相似的问题混淆.

我知道Django现在有基于模板的表单渲染.据我所知,这应该解决了必须从视图或表单中注入CSS类的问题,而不是将所有HTML/CSS保留在模板中.

这是我的目标:让我的表单和视图集中在什么显示,并专注于我的模板是如何被显示.所以我想在我的模板中保留所有HTML/CSS.

所以,我的问题是:

  • 如何向模板系统中的form-text所有TextInput小部件添加类(例如)?
  • 如何alert-warning从模板系统向所有错误消息(验证失败)添加类(例如)?

我可能误解了这个新功能的一些内容,所以如果我这样做了,请随时告诉我这是不是它的工作原理,或者我是在问这个不可能的事情.理想情况下,我想实现这些表单渲染更改到主模板.

示例问题

views.py:

class SignUp(generic.edit.CreateView):

    model = models.User
    template_name = 'usermgmt/sign_up.html'
    form_class = forms.UserCreateForm
    success_url = '/sign_up_done/'
Run Code Online (Sandbox Code Playgroud)

templates/master.html(我想在这里添加一些导致所有TextInput小部件获得类的东西):

<html>
<head>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
<title>{% block title %}{% endblock %} | Website</title>
</head>
<body>
  <div class="content-wrapper clearfix">
    {% block main %}{% endblock %}
  </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

templates/usermgmt/sign_up.html:

{% extends 'master.html' %}

{% block title %}Sign Up{% endblock %}

{% block main %}
<h1>Sign Up</h1>
<p>Enter your email to sign up!</p>
<form class="form-group" method="post">
  {% csrf_token %}
  <input type="hidden" name="next" value="{{ next }}">
  {{ form.as_p }}
  <button class="btn btn-primary" type="submit">Sign Up</button>
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

Ann*_*ell 8

继续JoséTomásTocino上面的回答,在Django 1.11中,我发现我的目录结构必须是:

主/模板/ Django的/表格/部件/ text.html

  • @GregSchmit你是对的,我试着评论,但没有代表.我想某种评论(希望能帮助下一个人)总比没有好.谢谢你不要投票给我 (3认同)

Jos*_*ino 4

据我从Django 1.11 的发行说明和我自己的测试中了解到,新功能允许我们通过简单地为每种小部件类型提供 HTML 文件来轻松自定义小部件的呈现方式。在以前的 Django 版本中,您必须提供该小部件的子类forms.widget.Widget并将该小部件一一分配给您的模型/表单字段(IIRC)。

\n\n

如果您想让所有TextInput小部件都有一个特定的类,您将必须添加您的自定义text.html(也可能是您自己的attrs.html )。

\n\n

例如,假设我有一个myforms带有应用程序的项目main。根据文档:

\n\n
\n

如果您使用 TemplatesSetting 渲染器,则覆盖小部件模板\n 的工作方式与覆盖项目中的任何其他模板相同。您无法使用其他内置渲染器\xe2\x80\x99 覆盖内置小部件模板。

\n
\n\n

所以我们需要在文件中设置渲染器settings.py

\n\n
FORM_RENDERER = \'django.forms.renderers.TemplatesSetting\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

但如果我们只这样做,我们就需要为所有输入元素提供模板。根据文档:

\n\n
\n

将此渲染器与内置小部件模板一起使用需要\n [...] [添加] INSTALLED_APPS 中的\'django.forms\' 和至少一个\n APP_DIRS=True 的引擎。

\n
\n\n

所以我们添加django.formsINSTALLED_APPS. 现在,为了添加文本输入元素的自定义,我们需要创建文件main/templates/django/forms/widgets/text.html并在其中添加自定义 HTML 代码,例如:

\n\n
<input type="text" class="myclass" value="{{widget.value}}">\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,如果我们在模板中显示表单,那么每当CharField需要呈现时,该代码就会出现。

\n\n

但是,如果您需要每个字段级别的控制,例如每个字段需要不同的类,那么所有这些都无关紧要。在这种情况下,您应该将我编写的内容与django-widget-tweaks结合起来,这样您就可以进行更灵活的小部件定制。

\n