Python Web 表单与用户认证

class Python,Django

在 Python Web 开发中,表单处理和用户认证是两个非常重要的部分。Django 提供了丰富的内置功能来处理这些任务,下面我们将分别讨论如何使用 Django 处理 Web 表单和用户认证。

1. 使用 Django 处理 Web 表单

Django 提供了一个强大的表单类,可以方便地创建和处理 Web 表单。

1.1 创建表单类

在 Django 中,表单通常通过创建一个继承自 forms.Formforms.ModelForm 的类来定义。forms.ModelForm 是基于模型的表单,适用于与数据库模型交互的情况。

myapp/forms.py 中创建一个简单的表单类:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

1.2 渲染表单

在视图中渲染表单,并在模板中显示它。在 myapp/views.py 中:

from django.shortcuts import render
from .forms import ContactForm

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            message = form.cleaned_data['message']
            # 这里可以将数据保存到数据库或发送电子邮件
            return render(request, 'thank_you.html', {'name': name})
    else:
        form = ContactForm()
  
    return render(request, 'contact.html', {'form': form})

templates/contact.html 中渲染表单:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Contact Form</title>
</head>
<body>
    <h1>Contact Us</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
</body>
</html>

2. Django 的用户认证

Django 内置了一个强大的用户认证系统,包括登录、注册、密码重置等功能。

2.1 用户注册

首先,创建一个注册表单。在 myapp/forms.py 中:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class RegisterForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

然后,在视图中处理注册逻辑。在 myapp/views.py 中:

from django.shortcuts import render, redirect
from .forms import RegisterForm

def register_view(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = RegisterForm()
  
    return render(request, 'register.html', {'form': form})

templates/register.html 中渲染注册表单:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User Registration</title>
</head>
<body>
    <h1>Register</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Register</button>
    </form>
</body>
</html>

2.2 用户登录

Django 提供了现成的登录视图,你可以直接使用它,或者自定义登录视图。首先,配置 URL 路由。在 myapp/urls.py 中:

from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

templates/login.html 中创建登录页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Login</button>
    </form>
</body>
</html>

2.3 保护视图(登录要求)

如果你希望某些视图仅对已登录用户开放,可以使用 login_required 装饰器:

from django.contrib.auth.decorators import login_required

@login_required
def dashboard_view(request):
    return render(request, 'dashboard.html')

2.4 密码重置

Django 还提供了现成的密码重置功能,只需配置相关视图和模板即可。在 urls.py 中:

from django.contrib.auth import views as auth_views

urlpatterns = [
    path('password_reset/', auth_views.PasswordResetView.as_view(template_name='password_reset.html'), name='password_reset'),
    path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='password_reset_done.html'), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='password_reset_confirm.html'), name='password_reset_confirm'),
    path('reset/done/', auth_views.PasswordResetCompleteView.as_view(template_name='password_reset_complete.html'), name='password_reset_complete'),
]

然后,你只需要创建相应的模板来显示这些视图。

总结

Django 提供了强大的工具来处理 Web 表单和用户认证。通过使用 Django 的表单类,你可以轻松创建和验证表单。用户认证系统则涵盖了用户注册、登录、注销、密码重置等常见功能,大大简化了 Web 开发的流程。

评论区
评论列表
menu