用户名英文_用户名英文怎么说
上一章我们基于Django实现了一个简单的“学习笔记”Web应用程序。这个Web应用程序存在一个问题:A用户可以访问B用户的学习笔记。本章我们将
上一章我们基于Django实现了一个简单的“学习笔记”Web应用程序这个Web应用程序存在一个问题:A用户可以访问B用户的学习笔记本章我们将新增accounts应用程序,建立一个身份注册和验证系统,支持用户登录、用户注册和用户管理自己创建的主题等功能。
项目改进1.新增accounts应用程序Django项目由多个应用程序组成,它们协同工作,让项目成为一个整体我们新增应用程序“accounts”,执行如下命令:pythonmanage.pystartapp。
accounts会生成accounts目录:
2.注册accounts应用程序在项目配置文件settings.py中添加自定义应用:
3.注册accounts应用程序URL匹配定义修改项目urls.py,将accounts应用程序的URL匹配定义注册到项目中:from django.contrib import admin from django.urls import path, include urlpatterns = [ path(
admin/, admin.site.urls), path(, include(accounts.urls, namespace=accounts)), path(, include(
learning_logs.urls, namespace=learning_logs)), ]4.创建登录和注册页面1)URL模式在“accounts”中新建urls.py:"""Defines URL patterns for accounts."""
from django.urls import path, include from . import views app_name = accounts urlpatterns = [
# Include default auth urls. path(, include(django.contrib.auth.urls)), # Registration page. path(
register/, views.register, name=register), ]2)视图修改“accounts”中的views.py,从数据库获取和处理数据后,传递给模板根据数据渲染出界面:from
django.shortcuts import render, redirect from django.contrib.auth import login from django.contrib.auth.forms
import UserCreationForm defregister(request):# 注册新用户if request.method != POST: # 生成一个空表单 form = UserCreationForm()
else: # 处理用户创建表单. form = UserCreationForm(data=request.POST) # 检查表单数据if form.is_valid(): new_user = form.save()
# 登录并且重定向到主页. login(request, new_user) return redirect(learning_logs:index)
# 将表单放入上下文传递到模版渲染. context = {form: form} return render(request, registration/register.html, context)
3)模版在“accounts”中新建目录“templates”及其子目录“registration”,并且在“registration”中创建login.html和register.html完整目录结构:。
login.html:{% extends learning_logs/base.html %} {% block content %} {% if form.errors %}
用户名或者密码不对,请重新输入
{% endif %} {% csrf_token %} {{ form.as_p }} 。登录 {% endblock content %}register.html:{% extends "learning_logs/base.html" %} {% block content %}
{% csrf_token %} {{ form.as_p }} <
buttonname="submit">注册 {% endblock content %}修改“learning_logs/templates/learning_logs”下的base.html:
学习笔记 - 主题
- {% if user.is_authenticated %} 你好, {{ user.username }}. {% else %}
>注册 - 登录 {% endif %}
{% block content %}{% endblock content %} {% if user.is_authenticated %}{% csrf_token %}
>注销 {% endif %}修改项目settings.py,新增如下配置,设置登录或者注销重定向的页面:LOGIN_REDIRECT_URL = learning_logs:index
LOGOUT_REDIRECT_URL = learning_logs:index
5.限制访问没有登录的情况下,访问主题等相关链接,应该重定向到登录页面修改“learning_logs"的view.py"使用@login_required限制访问from django.shortcuts 。
import render, redirect from django.contrib.auth.decorators import login_required from django.http import
Http404 from .models import Topic, Entry from .forms import TopicForm, EntryForm defindex(request)
:"""The home page for Learning Log."""return render(request, learning_logs/index.html) @login_required
deftopics(request):"""Show all topics.""" topics = Topic.objects.filter(owner=request.user).order_by(
date_added) context = {topics: topics} return render(request, learning_logs/topics.html, context)
@login_requireddeftopic(request, topic_id):"""Show a single topic and all its entries.""" topic = Topic.objects.get(id=topic_id)
# Make sure the topic belongs to the current user.if topic.owner != request.user: raise Http404 entries = topic.entry_set.order_by(
-date_added) context = {topic: topic, entries: entries} return render(request, learning_logs/topic.html
, context) @login_requireddefnew_topic(request):"""Add a new topic."""if request.method != POST:
# No data submitted; create a blank form. form = TopicForm() else: # POST data submitted; process data.
form = TopicForm(data=request.POST) if form.is_valid(): new_topic = form.save(commit=
False) new_topic.owner = request.user new_topic.save() return redirect(
learning_logs:topics) # Display a blank or invalid form. context = {form: form} return render(request,
learning_logs/new_topic.html, context) @login_requireddefnew_entry(request, topic_id):"""Add a new entry for a particular topic."""
topic = Topic.objects.get(id=topic_id) if request.method != POST: # No data submitted; create a blank form.
form = EntryForm() else: # POST data submitted; process data. form = EntryForm(data=request.POST)
if form.is_valid(): new_entry = form.save(commit=False) new_entry.topic = topic new_entry.save()
return redirect(learning_logs:topic, topic_id=topic_id) # Display a blank or invalid form. context = {
topic: topic, form: form} return render(request, learning_logs/new_entry.html, context) @login_required
defedit_entry(request, entry_id):"""Edit an existing entry.""" entry = Entry.objects.get(id=entry_id) topic = entry.topic
if topic.owner != request.user: raise Http404 if request.method != POST: # Initial request; pre-fill form with the current entry.
form = EntryForm(instance=entry) else: # POST data submitted; process data. form = EntryForm(instance=entry, data=request.POST)
if form.is_valid(): form.save() return redirect(learning_logs:topic, topic_id=topic.id) context = {
entry: entry, topic: topic, form: form} return render(request, learning_logs/edit_entry.html, context)
修改项目settings.py,新增如下配置,设置跳转页面:LOGIN_URL = accounts:login
6.将数据关联到用户我们需要将数据关联到用户,修改模型Topic,新增关联到用户的外键;历史已有Topic数据迁移;还要修改相关的视图和模版1)修改模型Topic修改“learning_logs"的models.py:。
from django.db import models from django.contrib.auth.models import User classTopic(models.Model):"""A topic the user is learning about."""
text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True)
# 新增关联到用户的外键,User是默认提供的类 owner = models.ForeignKey(User, on_delete=models.CASCADE) def__str__
(self):"""Return a string representation of the model."""return self.text classEntry(models.Model):
"""Something specific learned about a topic.""" topic = models.ForeignKey(Topic, on_delete=models.CASCADE) text = models.TextField() date_added = models.DateTimeField(auto_now_add=
True) classMeta: verbose_name_plural = entriesdef__str__(self):"""Return a simple string representing the entry."""
returnf"{self.text[:50]}..."2)历史已有Topic数据迁移我们之前已经创建了部分Topic,需要将这些数据迁移到指定用户,默认选择admin用户使用Django Shell查看admin用户的用户ID:。
pythonmanage.pyshell
我们得到了admin用户的用户ID:1,执行“生成数据迁移SQL相关的py文件”命令:pythonmanage.pymakemigrationslearning_logs选择选项1,设置默认值1:
执行数据迁移:pythonmanage.pymigrate完成数据迁移后,查看迁移数据:
3)限制用户管理自己创建的主题修改“learning_logs"的views.py:修改topics函数,只能查询用户自己创建的主题;修改topic函数,检查是否为当前登录用户;修改edit_entry函数检查是否为当前登录用户;
修改new_topic函数,设置创建主题的关联用户from django.shortcuts import render, redirect from django.contrib.auth.decorators 。
import login_required from django.http import Http404 from .models import Topic, Entry from .forms import
TopicForm, EntryForm defindex(request):"""The home page for Learning Log."""return render(request,
learning_logs/index.html) @login_requireddeftopics(request):#只能查询用户自己创建的主题 topics = Topic.objects.filter(owner=request.user).order_by(
date_added) context = {topics: topics} return render(request, learning_logs/topics.html, context)
@login_requireddeftopic(request, topic_id):"""Show a single topic and all its entries.""" topic = Topic.objects.get(id=topic_id)
# 检查是否为当前登录用户if topic.owner != request.user: raise Http404 entries = topic.entry_set.order_by(
-date_added) context = {topic: topic, entries: entries} return render(request, learning_logs/topic.html
, context) @login_requireddefnew_topic(request):"""Add a new topic."""if request.method != POST:
# No data submitted; create a blank form. form = TopicForm() else: # POST data submitted; process data.
form = TopicForm(data=request.POST) if form.is_valid(): new_topic = form.save(commit=
False) #设置创建主题的关联用户 new_topic.owner = request.user new_topic.save()
return redirect(learning_logs:topics) # Display a blank or invalid form. context = {form: form}
return render(request, learning_logs/new_topic.html, context) @login_requireddefnew_entry(request, topic_id)
:"""Add a new entry for a particular topic.""" topic = Topic.objects.get(id=topic_id) if request.method !=
POST: # No data submitted; create a blank form. form = EntryForm() else:
# POST data submitted; process data. form = EntryForm(data=request.POST) if form.is_valid(): new_entry = form.save(commit=
False) new_entry.topic = topic new_entry.save() return redirect(learning_logs:topic
, topic_id=topic_id) # Display a blank or invalid form. context = {topic: topic, form: form}
return render(request, learning_logs/new_entry.html, context) @login_requireddefedit_entry(request, entry_id)
:"""Edit an existing entry.""" entry = Entry.objects.get(id=entry_id) topic = entry.topic
#检查是否为当前登录用户if topic.owner != request.user: raise Http404 if request.method != POST:
# Initial request; pre-fill form with the current entry. form = EntryForm(instance=entry)
else: # POST data submitted; process data. form = EntryForm(instance=entry, data=request.POST)
if form.is_valid(): form.save() return redirect(learning_logs:topic, topic_id=topic.id) context = {
entry: entry, topic: topic, form: form} return render(request, learning_logs/edit_entry.html, context)
7.切换到中文环境Django默认使用英文和UTC时区,比如:鉴权页面中的用户名会显示"UserName"可以通过修改项目的setting.py文件切换到中文环境LANGUAGE_CODE = zh-hans。
TIME_ZONE = Asia/Shanghai
项目测试1.完整目录结构
2.启动服务器pythonmanage.pyrunserver3.使用浏览器访问http://127.0.0.1:80004.显示默认主页
5.点击主题当前未登录,会跳转到登录界面。
6.点击注册
按照填写要求输入用户名(test)和密码,如果不符合要求,会提示错误。
完成注册后,会跳转到主页,显示“你好,test”:
7.点击主题显示当前主题列表:
创建新主题:
显示新创建的主题:
点击主题名称,创建新条目:
显示创建的新条目:
点击编辑条目,保存修改:
显示编辑过的条目:
点击学习笔记,回到主页:
点击注销,退出登录:
点击登录,输入用户名密码:
登录成功后,跳转到主界面:
- 标签:
- 编辑:李松一
- 相关文章
-
宝箧印陀罗尼咒_宝箧印陀罗尼咒功德作用
“若人暂见是塔,一切皆除。其处亦无人马牛疫,童子童女疫。”尤其其中“若人暂见是塔,一切皆除。其处亦无人马牛疫,童子童女疫”的护持…
-
萄组词2个字_萄组词2个字大全
《走月亮》一课在生字词方面的学习要求是:一、认识“鹅、卵、俗、跃、穗、镀、埂、烁”等8个生字;本课在阅读方面的学习要求是:一…
- 蒲黄榆_蒲黄榆属于哪个区
- 中国移动最低套餐_中国移动最低套餐价格表2023
- 现金流动负债比率_现金流动负债比率一般多少合适
- 现金流动负债比率_现金流动负债比率一般多少合适
- 三国归晋_三国归晋谁统一了天下