如何在Django中自定义默认身份验证登录表单?

时间:2019-03-27 04:05:53

标签: python django django-forms

如何在Django中自定义默认登录表单?

# demo_project/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('', include('pages.urls')),
    path('users/', include('users.urls')), # new
    path('users/', include('django.contrib.auth.urls')), # new
    path('admin/', admin.site.urls),
]

<!-- templates/registration/login.html -->
    <h2>Login</h2>
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
    </form>

以上代码可以使用,但我需要自定义{{form.as_p}},该表格在哪里或可以覆盖?感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以覆盖默认的身份验证表单

喜欢

from django.contrib.auth.forms import AuthenticationForm

from django import forms


class UserLoginForm(AuthenticationForm):
    def __init__(self, *args, **kwargs):
        super(UserLoginForm, self).__init__(*args, **kwargs)

    username = forms.EmailField(widget=forms.TextInput(
        attrs={'class': 'form-control', 'placeholder': '', 'id': 'hello'}))
    password = forms.CharField(widget=forms.PasswordInput(
        attrs={
            'class': 'form-control',
            'placeholder': '',
            'id': 'hi',
        }
))

在url.py中,您可以像这样通过此自定义身份验证表单

from django.contrib.auth import views

from myapp.forms import UserLoginForm
urlpatterns = [

    path(
        'login/',
        views.LoginView.as_view(
            template_name="login.html",
            authentication_form=UserLoginForm
            ),
        name='login'
)
]

此外,您可以覆盖登录模板

并根据您的要求自定义模板

<form method="post">
    {{ form.non_field_errors }}
    <div class="form-group">

        <label for="{{ form.username.id_for_label }}">Username:</label>
        {{ form.username }}
        {{ form.username.errors }}

    </div>
    <div class="form-group">

        <label for="{{ form.password.id_for_label }}">Password:</label>
        {{ form.password }}
        {{ form.password.errors }}
    </div>
    <button type="submit">Login</button>
</form>

答案 1 :(得分:1)

您可以通过覆盖/编辑如下的 templates / registration / login.html 来自定义表单呈现。

这仅是示例,您可以根据需要更改css样式和格式。

<h2>Login</h2>
<form method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.username.errors }}
        <label for="{{ form.username.id_for_label }}">Username:</label>
        {{ form.username }}
    </div>
    <div class="fieldWrapper">
        {{ form.password.errors }}
        <label for="{{ form.password.id_for_label }}">Password:</label>
        {{ form.password }}
    </div>
    <button type="submit">Login</button>
</form>

您还可以遍历表单的字段

<h2>Login</h2>
<form method="post">
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
            {% if field.help_text %}
            <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        </div>
    {% endfor %}
    <button type="submit">Login</button>
</form>

您还可以从more form rendering options中检查here

答案 2 :(得分:1)

从问题出发,我假设您想更改html模板的外观,而不是python表单类。在这种情况下,您需要做的就是包括输入类型字段,这些字段具有与django-auth默认表单期望的名称和ids属性匹配的属性。您可以使用以下步骤来实现。

  1. 立即渲染(使用{{form.as_p}})来渲染模板。
  2. 检查元素并检查用户名,密码并提交由默认身份验证表单生成的提交按钮的名称和ID。
  3. 使用您自己的自定义样式重新创建相同的标签。

它类似于以下内容:

<form method="POST">
  {% csrf_token %}
  <input type="input" class="form-control" name="username" id="inputEmail" placeholder="Username" required >
  <input type="password" class="form-control" name="password" id="inputPass" placeholder="Password" required>
  <button type="submit" style="opacity: 1 !important;">Login</button>
  <a href="/password_reset">Reset Password</a>
</form>

之后,您可以发挥想象力,并根据需要设计登录表单。

希望这会有所帮助。