首页 > 解决方案 > 将 HTML 表单移至 Django 2.1

问题描述

我有许多预先编写好的网站表格。我需要保持这些原样而不是修改它们。

我还需要将这些移动到 Django 2.1 后端,该后端似乎有一个内置的表单生成系统,它似乎与表单本身不兼容(IE The Jinja Scripting for forms 似乎自动生成没有任何实际选择的形式)。

我找不到任何关于如何将现有表单移动到 Django 的文档,我也不知道如何。

谢谢你帮助我。

    <div class="container">
    <form class="form-signin" name="login" action="timesheet">
        <h1 class="h3 mb-3 font-weight-normal">Sign In</h1>
        <label for="inputEmail" class="sr-only">Email address</label>
        <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" placeholder="Password" required>
        <div class="checkbox mb-3">
            <label>
                <input type="checkbox" value="remember-me"> Remember me
            </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </form>
</div>

标签: htmldjangopython-3.xformsdjango-forms

解决方案


你是对的 Django 有自己的处理表单的方式,但幸运的是它是完全可定制的。假设您有一个要显示给用户的 LoginForm:

您必须在 Django 中创建一个代表该字段的表单。此外,如果凭据正确,表单将在您的 django 系统中对用户进行身份验证,您将使此表单继承自 Django 内置的 AuthentificationForm: forms.py:

from django.contrib.auth.forms import AuthenticationForm
class EmailAuthenticationForm(AuthenticationForm):
    required_css_class = 'required'
    remember_me = forms.BooleanField(
        required=False,
        label='Remember me for two weeks',
    )

    def clean_username(self):
        """Prevent case-sensitive erros in email/username."""
        return self.cleaned_data['username'].lower()

接下来我们必须将表单提供给用户(通过 html)。因此,我们创建了一个视图,在您的应用程序的 views.py 中呈现表单: views.py:

from forms import EmailAuthentificationForm
def login(request):
    if request.method == 'POST':
        form = EmailAuthenticationForm(request.POST)
        if form.is_valid():
            pass  # does nothing, just trigger the validation
    else:
        form = EmailAuthenticationForm()
    return render(request, 'login.html', {'form': form})

现在为了让我们的生活更轻松,django 可以自动为您呈现表单,而无需任何样式,只是为了让事情正常工作。但是由于我们有自己的 html 布局和我们自己的样式,我们想要做的是手动渲染表单: login.html

<div class="container">
<form method="post" class="form-signin" name="login" action="timesheet" novalidate>
    {% csrf_token %}


    {{ form.non_field_errors }}

    {{ form.source.errors }}
    {{ form.source }}

    <h1 class="h3 mb-3 font-weight-normal">Sign In</h1>
    <label for="inputEmail" class="sr-only">Email address</label>
    {{form.email}} 
    <label for="inputPassword" class="sr-only">Password</label>
   {{form.password}}
    <div class="checkbox mb-3">
        <label>
           {{form.remember_me}}
        </label>
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>

现在电子邮件和密码字段仍然不会使用您希望字段具有的所有 css 属性来呈现,您需要在身份验证表单中的电子邮件和密码字段中添加其他属性。要了解如何做到这一点,请在此处 阅读更多内容要了解有关在 django 中呈现您自己的自定义表单的更多信息,请阅读此处


推荐阅读