继续

not image

好的,继续完成剩余部分: --- #### **4. 配置 URL 路由(urls.py)** **在 `your_app/urls.py` 中:** ```python from django.urls import path from . import views urlpatterns = [ path('register/', views.register, name='register'), path('login/', views.user_login, name='login'), # 其他路径... ] ``` --- #### **5. 创建模板文件** **在 `your_app/templates/register.html` 中:** ```html 注册

注册

{% csrf_token %} {{ form.as_p }}
{% if form.errors %}

请修正上述错误。

{% endif %} ``` **在 `your_app/templates/login.html` 中:** ```html 登录

登录

{% csrf_token %} {{ form.as_p }}
{% if form.errors %}

请修正上述错误。

{% endif %} ``` --- #### **6. 设置登录重定向** 在 `settings.py` 中配置登录后的跳转页面: ```python LOGIN_REDIRECT_URL = 'home' # 假设主页的 URL 名称为 'home' ``` --- #### **7. 迁移数据库** 运行以下命令创建用户模型: ```bash python manage.py makemigrations python manage.py migrate ``` --- #### **8. 测试** - 访问 `yourdomain.com/register/` 进行注册。 - 访问 `yourdomain.com/login/` 进行登录。 --- ### **三、完整代码总结** #### **关键点说明** 1. **自定义用户模型**: - 通过继承 `AbstractUser`,将邮箱设为唯一标识(`USERNAME_FIELD = 'email'`)。 - 移除默认的 `username` 字段(如需保留,需自行添加)。 2. **表单验证**: - `RegisterForm` 包含邮箱、密码和确认密码字段。 - `LoginForm` 使用邮箱替代用户名。 3. **CSRF 保护**: - 模板中通过 `{% csrf_token %}` 防止跨站请求伪造。 --- ### **四、扩展功能(可选)** #### **1. 邮箱验证** 在用户注册后发送验证邮件(需配置邮件服务): ```python # 在 views.py 的 register 视图中添加: from django.core.mail import send_mail def register(request): # ...(原有代码) if form.is_valid(): user = form.save(commit=False) # 暂不保存,等待验证 user.is_active = False # 初始状态设为未激活 user.save() # 发送验证邮件(需配置 EMAIL_BACKEND 等设置) send_mail( '激活账号', '点击链接激活:http://yourdomain.com/activate/' + str(user.id), 'from@example.com', [user.email], fail_silently=False, ) return redirect('email_sent') # ...(其余代码) ``` #### **2. 登录后的权限控制** 在需要登录才能访问的视图中添加装饰器: ```python from django.contrib.auth.decorators import login_required @login_required def home(request): return render(request, 'home.html') ``` --- ### **五、常见问题** 1. **“no such table” 错误**: - 确保已运行 `makemigrations` 和 `migrate`,且 `AUTH_USER_MODEL` 配置正确。 2. **CSRF 验证失败**: - 确保表单中包含 `{% csrf_token %}`。 3. **登录后跳转异常**: - 检查 `LOGIN_REDIRECT_URL` 是否指向存在的 URL 名称。 --- 如果需要进一步优化(如密码强度校验、多因素认证等),可以继续讨论! 😊

评论区:

评论:

请输入内容: