版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目7
进一步理解数据库能够查看SQLite数据库中的数据能够提升Admin管理后台页面的可读性能够为Django项目配置MySQL数据库项目目标任务7.1
可视化查看SQLite数据库内容7.1.1 下载并安装宝塔Windows面板过渡页7.1.1 下载并安装宝塔Windows面板图7-1宝塔官网首页7.1.1 下载并安装宝塔Windows面板图7-2宝塔Windows面板首页7.1.1 下载并安装宝塔Windows面板图7-3面板初始信息界面图7-4“宝塔Windows面板工具箱”界面7.1.1 下载并安装宝塔Windows面板图7-5宝塔Windows面板登录页面7.1.1 下载并安装宝塔Windows面板图7-6未登录的宝塔Windows面板首页7.1.1 下载并安装宝塔Windows面板图7-7“初始化推荐配置”对话框7.1.1 下载并安装宝塔Windows面板图7-8登录后的宝塔Windows面板首页7.1.2 查看数据过渡页7.1.2 查看数据图7-9宝塔Windows面板数据库管理页面7.1.2 查看数据图7-10“添加SQLite数据库”对话框7.1.2 查看数据图7-11选择db.sqlite3文件7.1.2 查看数据图7-12成功添加SQLite数据库后的数据库管理页面7.1.2 查看数据图7-13加载了数据库的“管理”对话框任务7.2
优化Admin管理后台页面显示7.2.1 优化模型显示过渡页7.2.1 优化模型显示图7-14movie应用列表7.2.1 优化模型显示在/movie/models.py添加粗体代码:fromdjango.dbimportmodelsclassMovie(models.Model):title=models.CharField(max_length=100,verbose_name="电影名")…
def__str__(self):returnself.title7.2.1 优化模型显示图7-15优化后的movie应用列表7.2.2优化列表页显示过渡页7.2.2优化列表页显示在/book/admin.py添加以下粗体代码:fromdjango.contribimportadminfrom.modelsimportBookclassBookAdmin(admin.ModelAdmin):list_display=('title','description’)admin.site.register(Book,BookAdmin)7.2.2优化列表页显示图7-16book应用列表7.2.2优化列表页显示图7-17添加图书对象7.2.2优化列表页显示在/book/admin.py添加以下粗体代码:fromdjango.contribimportadminfrom.modelsimportBookclassBookAdmin(admin.ModelAdmin):list_display=('title','description')
search_fields=['title','description']admin.site.register(Book,BookAdmin)7.2.2优化列表页显示图7-18显示搜索结果的book应用列表7.2.2优化列表页显示在/book/admin.py添加以下粗体代码:fromdjango.contribimportadminfrom.modelsimportBookclassBookAdmin(admin.ModelAdmin):list_display=('title','description')search_fields=['title','description']list_editable=('description’,)admin.site.register(Book,BookAdmin)7.2.2优化列表页显示图7-19配置list_editable之后的book应用列表任务7.3
配置Django项目的MySQL数据库7.3.1 配置MySQL数据库过渡页7.3.1 配置MySQL数据库图7-20MySQL数据库服务页面7.3.1 配置MySQL数据库图7-21phpMyAdmin首页7.3.1 配置MySQL数据库图7-21phpMyAdmin首页7.3.1 配置MySQL数据库图7-23创建数据库7.3.2配置MySQL数据库运行环境过渡页7.3.2配置MySQL数据库运行环境安装完成PyMySQL之后,在/MiniDouban/__init__.py文件中添加以下代码:importpymysqlpymysql.install_as_MySQLdb()安装PyMySQL:pipinstallpymysql7.3.3配置MySQL数据库信息并执行迁移过渡页7.3.3配置MySQL数据库信息并执行迁移在/MiniDouban/settings.py替换粗体代码:DATABASES={'default':{ …'ENGINE':'django.db.backends.mysql','NAME':'minidouban','USER':'root','PASSWORD':'root123','HOST':'','PORT':'3306',}}7.3.3配置MySQL数据库信息并执行迁移执行迁移,把之前生成的迁移文件应用到MySQL数据库中:pythonmanage.pymigrate7.3.3配置MySQL数据库信息并执行迁移图7-24执行迁移后的minidouban数据库7.3.4 将SQLite中的数据转存到MySQL中过渡页7.3.4 将SQLite中的数据转存到MySQL中将数据库中的数据保存到json文件中:pythonmanage.pydumpdata--indent=2--output=minidouban.json添加-Xutf8标签来激活PythonUTF-8模式python-Xutf8manage.pydumpdata--indent=2--output=minidouban.json将json文件中的数据转储到数据库中:pythonmanage.pyloaddataminidouban.json项目8
项目优化与模板拓展了解如何优化项目结构了解Django的多应用URL路由分发掌握模板继承的概念项目目标掌握基础模板的创建与应用方法掌握让导航链接生效的方法掌握添加页脚的方法掌握配置静态文件服务的方法掌握集成分页模板的方法项目目标了解Django模板语言任务8.1
结构优化与多应用URL路由分发任务8.1结构优化与多应用URL路由分发图8-1URL路由分发原理任务8.1结构优化与多应用URL路由分发在根路由文件/MiniDouban/urls.py添加粗体代码:fromdjango.urlsimportpath,include…urlpatterns=[…path('movie/',include('movie.urls')),path('book/',include('book.urls')),]任务8.1结构优化与多应用URL路由分发在movie应用中创建一个urls.py,并在该文件中添加如下代码:fromdjango.urlsimportpathfrom.importviewsurlpatterns=[path("moviehome",views.moviehome,name='moviehome'),]任务8.1结构优化与多应用URL路由分发在根路由文件/MIniDouban/urls.py删除粗体代码:…urlpatterns=[…path(moviehome/',views.moviehome,name='moviehome'),…]在book应用中创建一个urls.py,并在该文件中添加如下代码:fromdjango.urlsimportpathfrom.importviewsurlpatterns=[path('bookhome',views.bookhome,name='bookhome'),]任务8.1结构优化与多应用URL路由分发在根路由文件/MIniDouban/urls.py删除粗体代码:…frombookimportviewsasbookviews…urlpatterns=[…path('bookhome',bookviews.bookhome,name='bookhome'),…]任务8.1结构优化与多应用URL路由分发图8-2项目结构优化后的movie应用首页任务8.1结构优化与多应用URL路由分发图8-3结构优化后的book应用首页任务8.1结构优化与多应用URL路由分发任务8.2
创建与应用基础模板8.2.1 创建基础模板过渡页8.2.1 创建基础模板在/movie/templates/home.html中添加粗体代码:<!DOCTYPEhtml><html><head>…
<metaname="viewport"content="width=device-width,initial-scale=1"/></head><body><navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3"><divclass="container"><aclass="navbar-brand"href="#">首页</a><buttonclass="navbar-toggler"type="button"data-bs-toggle="collapse"data-bs-target="#navbarNavAltMarkup"aria-controls="navbarNavAltMarkup"aria-expanded="false"aria-label="Togglenavigation"><spanclass="navbar-toggler-icon"></span></button><divclass="collapsenavbar-collapse"id="navbarNavAltMarkup"><divclass="navbar-navms-auto"><aclass="nav-link"href="#">电影</a><aclass="nav-link"href="#">读书</a><aclass="nav-link"href="#">登录</a><aclass="nav-link"href="#">注册</a></div></div></div></nav>…</body></html>8.2.1 创建基础模板图8-4带有导航栏的项目首页8.2.1 创建基础模板图8-5缩小浏览器窗口宽度的项目首页8.2.1 创建基础模板在/templates/base.html中添加粗体代码:<!DOCTYPEhtml><html><head><title>MiniDouban</title><linkhref="/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"rel="stylesheet"integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH"crossorigin="anonymous"><scriptsrc="/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"crossorigin="anonymous"></script><metaname="viewport"content="width=device-width,initial-scale=1"/></head><body><navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3"><divclass="container"><aclass="navbar-brand"href="#">首页</a><buttonclass="navbar-toggler"type="button"data-bs-toggle="collapse"data-bs-target="#navbarNavAltMarkup"aria-controls="navbarNavAltMarkup"aria-expanded="false"aria-label="Togglenavigation"><spanclass="navbar-toggler-icon"></span></button><divclass="collapsenavbar-collapse"id="navbarNavAltMarkup"><divclass="navbar-navms-auto"><aclass="nav-link"href="#">电影</a><aclass="nav-link"href="#">读书</a><aclass="nav-link"href="#">登录</a><aclass="nav-link"href="#">注册</a></div></div></div></nav><divclass="container">{%blockcontent%}{%endblockcontent%}</div></body></html>8.2.1 创建基础模板为了防止Django项目无法自动识别到base.html基础模板,我们最好在/MiniDouban/settings.py中的TEMPLATES属性中的DIRS添加新的templates文件夹路径:TEMPLATES=[{"BACKEND":"django.template.backends.django.DjangoTemplates","DIRS":[os.path.join(BASE_DIR,'movie/templates'),os.path.join(BASE_DIR,'book/templates'),os.path.join(BASE_DIR,'templates'),],"APP_DIRS":True,…},},]8.2.2 应用基础模板过渡页8.2.2 应用基础模板在/movie/templates/home.html中将header标签和导航栏的部分替换为粗体代码:{%extends'base.html'%}{%blockcontent%}<divclass="container">…</div>{%endblockcontent%}8.2.2 应用基础模板同样在/movie/templates/moviehome.html中将header标签和导航栏的部分替换为粗体代码:{%extends'base.html'%}{%blockcontent%}<divclass="container">…</div>{%endblockcontent%}8.2.2 应用基础模板图8-6带有导航栏的movie应用首页任务8.3
完善基础模板8.3.1 让导航链接生效过渡页8.3.1 让导航链接生效在/templates/base.html替换粗体代码:<navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3"><divclass="container"><aclass="navbar-brand"href="{%url'home'%}">首页</a> …<divclass="collapsenavbar-collapse"id="navbarNavAltMarkup"><divclass="navbar-navms-auto"><aclass="nav-link"href="{%url'moviehome'%}">电影</a><aclass="nav-link"href="{%url'bookhome'%}">读书</a><aclass="nav-link"href="#">登录</a><aclass="nav-link"href="#">注册</a></div></div></div></nav>8.3.1 让导航链接生效在/MiniDouban/urls.py根路由文件中,定义home:…urlpatterns=[path("admin/",admin.site.urls),path('',views.home,name='home'),path('signup/',views.signup,name='signup'),path('movie/',include('movie.urls')),path('book/',include('book.urls')),]…8.3.1 让导航链接生效在movie应用的子路由文件/movie/urls.py中定义moviehome:…urlpatterns=[path("moviehome",views.moviehome,name='moviehome'),]在book应用的子路由文件/book/urls.py中定义bookhome:…urlpatterns=[path('bookhome',views.bookhome,name='bookhome'),]8.3.2 添加页脚过渡页8.3.2 添加页脚在/templates/base.html文件中,添加以下粗体内容:…<divclass="container">{%blockcontent%}{%endblockcontent%}</div><footerclass="text-centertext-lg-startbg-lighttext-mutedmt-4"><divclass="text-centerp-4">©Copyright-<aclass="text-resetfw-boldtext-decoration-none"target="_blank"href="/OSYouth/">OSYouth</a></div></footer></body></html>8.3.2 添加页脚图8-7带有页脚的项目首页8.3.3 配置静态文件服务过渡页8.3.3 配置静态文件服务静态文件默认配置:…#Staticfiles(CSS,JavaScript,Images)#/en/5.1/howto/static-files/STATIC_URL="static/"…8.3.3 配置静态文件服务在/templates/base.html替换粗体代码:…<navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3"><divclass="container"><aclass="navbar-brand"href="{%url'home'%}">{%loadstatic%}<imgsrc="{%static'images/logo.jpg'%}"alt=""width="30"height="30"class="d-inline-blockalign-text-top"/>
首页
</a>…8.3.3 配置静态文件服务在/MiniDouban/settings.py添加以下代码:…STATICFILES_DIRS=[os.path.join(BASE_DIR,'static'),]…图8-8带Logo图片的导航栏8.3.4 集成分页模板过渡页8.3.4 集成分页模板在/movie/views.py替换粗体代码:…fromdjango.core.paginatorimportPaginator#Createyourviewshere.defmoviehome(request):searchTerm=request.GET.get('searchMovie')ifsearchTerm:
movie_list=Movie.objects.filter(title__contains=searchTerm)else:movie_list=Movie.objects.all()
paginator=Paginator(movie_list,2)page_number=request.GET.get('page',1)movies=paginator.page(page_number)returnrender(request,'moviehome.html',{'searchTerm':searchTerm,'movies':movies})…8.3.4 集成分页模板在/templates文件夹中创建pagination.html模板文件:<divclass="pagination"><spanclass="step-links">{%ifpage.has_previous%}<ahref="?page={{page.previous_page_number}}">上一页</a>{%endif%}<spanclass="current">{{page.number}}/{{page.paginator.num_pages}}页
</span>{%ifpage.has_next%}<ahref="?page={{page.next_page_number}}">下一页</a>{%endif%}</span></div>8.3.4 集成分页模板在/movie/templates/moviehome.html添加粗体代码:{%extends'base.html'%}{%blockcontent%}<divclass="container">…</div><divclass="d-flexjustify-content-centeralign-items-center">{%include"pagination.html"withpage=movies%}</div>{%endblockcontent%}8.3.4 集成分页模板图8-9带有分页的moviehome首页任务8.4
页面展示优化与详情页交互设计8.4.1 Django模板语言与过滤器过渡页8.4.1 Django模板语言与过滤器在/movie/templates/moviehome.html添加粗体代码:{%extends'base.html'%}{%blockcontent%}<divclass="container">…<divclass="rowrow-cols-1row-cols-md-3g-4">…<pclass="card-text">{{movie.description|truncatechars:40}}</p>…{%endblockcontent%}8.4.1 Django模板语言与过滤器图8-10使用truncatechars截断字符串过滤器后的movie应用首页8.4.2 创建详情页面过渡页8.4.2 创建详情页面在/movie/urls.py添加粗体代码:fromdjango.urlsimportpathfrom.importviewsurlpatterns=[path("moviehome",views.moviehome,name='moviehome'),
path('<int:movie_id>',views.moviedetail,name='moviedetail'),]8.4.2 创建详情页面在/movie/views.py添加视图函数moviedetail:…fromdjango.shortcutsimportget_object_or_404…defmoviedetail(request,movie_id):movie=get_object_or_404(Movie,pk=movie_id)returnrender(request,'moviedetail.html',{'movie':movie})8.4.2 创建详情页面在/movie/templates/文件夹中创建moviedetail.html文件:{%extends'base.html'%}{%blockcontent%}<divclass="cardmb-3"><divclass="rowg-0"><divclass="col-md-4"><imgsrc="{{movie.image.url}}"class="img-fluidrounded-start"alt=""></div><divclass="col-md-8"><divclass="card-body"><h5class="card-title">{{movie.title}}</h5><pclass="card-text">{{movie.description}}</p><pclass="card-text">{%ifmovie.url%}<ahref="{{movie.url}}"class="btnbtn-primary">
电影资源链接
</a>{%endif%}</p></div></div></div></div>{%endblockcontent%}8.4.2 创建详情页面图8-11movie应用的详情页示例8.4.2 创建详情页面在/book/urls.py添加粗体代码:fromdjango.urlsimportpathfrom.importviewsurlpatterns=[path('bookhome',views.bookhome,name='bookhome'),
path('<int:book_id>',views.bookdetail,name='bookdetail'),]8.4.2 创建详情页面在/book/views.py添加视图函数bookdetail:…fromdjango.shortcutsimportget_object_or_404…defbookdetail(request,book_id):book=get_object_or_404(Book,pk=book_id)returnrender(request,'bookdetail.html',{'book':book})8.4.2 创建详情页面在/book/templates/文件夹中创建bookdetail.html文件:{%extends'base.html'%}{%blockcontent%}<divclass="cardmb-3"><divclass="rowg-0"><divclass="col-md-4"><imgsrc="{{book.image.url}}"class="img-fluidrounded-start"alt=""></div><divclass="col-md-8"><divclass="card-body"><h5class="card-title">{{book.title}}</h5><pclass="card-text">{{book.description}}</p><pclass="card-text">{%ifbook.url%}<ahref="{{book.url}}"class="btnbtn-primary">
电子书链接
</a>{%endif%}</p></div></div></div></div>{%endblockcontent%}8.4.2 创建详情页面图8-12book应用的详情页示例8.4.3 添加到详情页面的超链接过渡页8.4.3 添加到详情页面的超链接在/movie/templates/moviehome.html添加粗体代码:…{%formovieinmovies%}<divv-for="movieinmovies"class="col"><divclass="card"><imgclass="card-img-top"src="{{movie.image.url}}"/><divclass="card-body"><ahref="{%url'moviedetail'movie.id%}"> <h5class="card-titlefw-bold">{{movie.title}}</h5></a><pclass="card-text">{{movie.description|truncatechars:40}}</p>…{%endfor%}…图8-13标题带有详情页URL跳转超链接的movie应用首页8.4.3 添加到详情页面的超链接在/book/templates/bookhome.html添加粗体代码:…{%forbookinbooks%}<divv-for="bookinbooks"class="col"><divclass="card"><imgclass="card-img-top"src="{{book.image.url}}"/><divclass="card-body">
<ahref="{%url'bookdetail'book.id%}"><h5class="card-titlefw-bold">{{book.title}}</h5></a><pclass="card-text">{{book.description|truncatechars:40}}</p>…{%endfor%}…8.4.3 添加到详情页面的超链接图8-14标题带有详情页URL跳转超链接的book应用首页8.4.3 添加到详情页面的超链接项目9
用户注册与登录能够创建注册表单能够创建用户能够编写代码处理用户创建错误项目目标能够编写代码实现自定义UserCreationForm表单能够编写代码实现在页面中显示用户是否登录能够实现用户注销功能项目目标能够实现用户登录功能任务9.1
用户注册功能实现9.1.1 创建注册表单过渡页9.1.1 创建注册表单创建新应用accounts: pythonmanage.pystartappaccounts在/MiniDouban/settings.py中添加新应用:…INSTALLED_APPS=[…'movie','book','accounts',]…9.1.1 创建注册表单在根路由文件/MiniDouban/urls.py添加粗体代码:...urlpatterns=[path("admin/",admin.site.urls),path('',views.home,name='home'),path('signup/',views.signup,name='signup'),path('movie/',include('movie.urls')),path('book/',include('book.urls')),
path('accounts/',include('accounts.urls')),]9.1.1 创建注册表单在accounts应用中创建urls.py文件,并添加以下代码:fromdjango.urlsimportpathfrom.importviewsurlpatterns=[path('signupaccount/',views.signupaccount,name='signupaccount'),]9.1.1 创建注册表单在/accounts/views.py添加视图函数signupaccount:fromdjango.shortcutsimportrenderfromdjango.contrib.auth.formsimportUserCreationFormdefsignupaccount(request):returnrender(request,'signupaccount.html',{'form':UserCreationForm})9.1.1 创建注册表单在/accounts/文件夹下创建templates文件夹,并在其中创建signupaccount.html,并添加以下代码:{%extends'base.html'%}{%blockcontent%}<divclass="cardmb-3"><divclass="rowg-0"><div><divclass="card-body"><h5class="card-title">注册</h5><pclass="card-text"><formmethod="POST">{%csrf_token%}{{form.as_p}}<buttontype="submit"class="btnbtn-primary">
注册
</button></form></p></div></div></div></div>{%endblockcontent%}9.1.1 创建注册表单图9-1用户注册表单页面9.1.2 实现视图函数逻辑过渡页9.1.2 实现视图函数逻辑在/accounts/views.py添加粗体代码:fromdjango.shortcutsimportrender,redirectfromdjango.contrib.auth.formsimportUserCreationFormfromdjango.contrib.auth.modelsimportUserfromdjango.contrib.authimportlogindefsignupaccount(request):ifrequest.method=='GET':returnrender(request,'signupaccount.html',{'form':UserCreationForm})else:password1=request.POST.get('password1')password2=request.POST.get('password2')username=request.POST.get('username')ifpassword1andpassword2andpassword1==password2:user=User.objects.create_user(username=username,password=password1)user.save()login(request,user)returnredirect('moviehome')图9-2Admin管理后台页面9.1.2 实现视图函数逻辑任务9.2
用户注册异常与错误处理9.2.1 处理密码不一致的情况过渡页9.2.1 处理密码不一致的情况在/accounts/views.py添加粗体代码:defsignupaccount(request):ifrequest.method=='GET':returnrender(request,'signupaccount.html',{'form':UserCreationForm})else:password1=request.POST.get('password1')password2=request.POST.get('password2')username=request.POST.get('username')ifpassword1andpassword2andpassword1==password2:user=User.objects.create_user(username=username,password=password1)user.save()login(request,user)returnredirect('moviehome')
else:returnrender(request,'signupaccount.html',{'form':UserCreationForm,'error':'输入的密码不一致'})9.2.1 处理密码不一致的情况在/accounts/templates/signupaccount.html中添加以下粗体代码:{%extends'base.html'%}{%blockcontent%}<divclass="cardmb-3"><divclass="rowg-0"><div><divclass="card-body"><h5class="card-title">注册</h5>{%iferror%}<divclass="alertalert-dangermt-3"role="alert">{{error}}</div>{%endif%}<pclass="card-text">…9.2.1 处理密码不一致的情况图9-3带有error消息的注册表单页面9.2.2 处理用户名已存在的情况过渡页9.2.2 处理用户名已存在的情况在/accounts/views.py添加粗体代码:…fromdjango.dbimportIntegrityErrordefsignupaccount(request):…ifpassword1andpassword2andpassword1==password2:try:user=User.objects.create_user(username=username,password=password1)user.save()login(request,user)returnredirect('moviehome')
exceptIntegrityError:returnrender(request,'signupaccount.html',{'form':UserCreationForm,'error':'用户已存在'})else:returnrender(request,'signupaccount.html',{'form':UserCreationForm,'error':'输入的密码不一致'})9.2.2 处理用户名已存在的情况图9-4带有用户已存在信息的用户表单注册页面任务9.3
自定义表单与界面优化9.3.1 自定义表单过渡页9.3.1 自定义表单在accounts应用中创建forms.py文件,并添加以下代码:fromdjango.contrib.auth.formsimportUserCreationFormclassUserCreateForm(UserCreationForm):def__init__(self,*args,**kwargs):super(UserCreateForm,self).__init__(*args,**kwargs)forfieldnamein['username','password1','password2']:self.fields[fieldname].help_text=Noneself.fields[fieldname].widget.attrs.update({'class':'form-control'})9.3.2 使用自定义表单过渡页9.3.2 使用自定义表单在/accounts/views.py使用自定义表单UserCreateForm:…from.formsimportUserCreateFormdefsignupaccount(request):ifrequest.method=='GET':returnrender(request,'signupaccount.html',{'form':UserCreateForm})else:…exceptIntegrityError:returnrender(request,'signupaccount.html',{'form':UserCreateForm,'error':'用户已存在'})else:returnrender(request,'signupaccount.html',{'form':UserCreateForm,'error':'输入的密码不一致'})9.3.2 使用自定义表单图9-5使用自定义表单的注册用户页面任务9.4
用户登录与注销功能实现9.4.1 显示用户是否登录过渡页9.4.1 显示用户是否登录在用户注册并登录之后,我们仍然在导航栏中显示“登录”和“注册”按钮:图9-6登录之后的导航栏9.4.1 显示用户是否登录在/templates/base.html中添加以下粗体代码:…<navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3">…{%ifuser.is_authenticated%}<aclass="nav-link"href="#">
注销({{user.username}})</a>{%else%}<aclass="nav-link"href="#">登录</a><aclass="nav-link"href="{%url'signupaccount'%}">注册</a>{%endif%}</div></div></div></nav>9.4.1 显示用户是否登录图9-7显示用户名的注册表单页面9.4.2 实现注销功能过渡页9.4.2 实现注销功能在/accounts/urls.py添加粗体代码:…urlpatterns=[path('signupaccount/',views.signupaccount,name='signupaccount'),
path('logout/',views.logoutaccount,name='logoutaccount'),]9.4.2 实现注销功能在/accounts/views.py添加粗体代码:…fromdjango.contrib.authimportlogin,logout…deflogoutaccount(request):logout(request)returnredirect('moviehome')9.4.2 实现注销功能在/templates/base.html添加粗体代码:<navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3"><divclass="collapsenavbar-collapse"id="navbarNavAltMarkup"><divclass="navbar-navms-auto"><aclass="nav-link"href="{%url'moviehome'%}">电影</a><aclass="nav-link"href="{%url'bookhome'%}">读书</a>{%ifuser.is_authenticated%}<aclass="nav-link"href="{%url'logoutaccount'%}">
注销({{user.username}})</a>{%else%}<aclass="nav-link"href="#">登录</a><aclass="nav-link"href="{%url'signupaccount'%}">注册</a>{%endif%}</div></div></div></nav>9.4.3 实现登录功能过渡页9.4.3 实现登录功能在/accounts/urls.py添加粗体代码:…urlpatterns=[path('signupaccount/',views.signupaccount,name='signupaccount'),path('logout/',views.logoutaccount,name='logoutaccount'),path('login/',views.loginaccount,name='loginaccount'),]9.4.3 实现登录功能在/accounts/views.py添加粗体代码:…fromdjango.contrib.auth.formsimportAuthenticationFormfromdjango.contrib.authimportlogin,logout,authenticate…defloginaccount(request):ifrequest.method=='GET':returnrender(request,'loginaccount.html',{'form':AuthenticationForm})else:user=authenticate(request,username=request.POST['username'],password=request.POST['password'])ifuserisNone:returnrender(request,'loginaccount.html',{'form':AuthenticationForm,'error':'用户名或密码错误'})else:login(request,user)returnredirect('moviehome')9.4.3 实现登录功能在/accounts/templates/文件夹中创建loginaccount.html,并拷贝signupaccount.html后,修改粗体代码:{%extends'base.html'%}{%blockcontent%}<divclass="cardmb-3"><divclass="rowg-0"><div><divclass="card-body"><h5class="card-title">登录</h5>{%iferror%}<divclass="alertalert-dangermt-3"role="alert">{{error}}</div>{%endif%}<pclass="card-text"><formmethod="POST">{%csrf_token%}{{form.as_p}}<buttontype="submit"class="btnbtn-primary">
登录
</button></form></p></div></div></div></div>{%endblockcontent%}9.4.3 实现登录功能图9-8用户登录表单页面9.4.3 实现登录功能在/templates/base.html添加粗体代码:<navclass="navbarnavbar-expand-lgnavbar-lightbg-lightmb-3"><divclass="collapsenavbar-collapse"id="navbarNavAltMarkup"><divclass="navbar-navms-auto"><aclass="nav-link"href="{%url'moviehome'%}">电影</a><aclass="nav-link"href="{%url'bookhome'%}">读书</a>{%ifuser.is_authenticated%}<aclass="nav-link"href="{%url'logoutaccount'%}">
注销({{user.username}})</a>{%else%}<aclass="nav-link"href="{%url'loginaccount'%}">登录</a><aclass="nav-link"href="{%url'signupaccount'%}">注册</a>{%endif%}</div></div></div>项目10
登录用户评论功能实现及页面访问控制能够创建电影评论模型能够实现发表评论的功能能够实现展示评论的功能能够实现修改评论的功能项目目标能够实现删除评论的功能能够实现授权功能任务10.1
登录用户评论功能的建模与实现10.1.1 创建评论模型过渡页10.1.1 创建评论模型在/movie/models.py添加以下代码:…fromdjango.contrib.auth.modelsimportUser…classReview(models.Model):text=models.CharField(max_length=100)date=models.DateTimeField(auto_now_add=True)user=mode
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CHES 158-2025泵站标准化管理技术导则
- T/CFA 0143-2022铸造用煤粉生产、运输、仓储安全规范
- T/CASMES 301-2024储能锂离子电池 冷板式液冷温控系统技术要求
- T/CAAMTB 123-2023质量分级及“领跑者”评价要求 纯电动乘用车
- 医院医疗废物泄露应急演练方案
- 2026唯物论复习好
- 《中国哲学简史》课件
- Delphi第三章Delphi基本程序设计
- T/CYPR 7-2024长垣烹饪技艺 脆皮卤鸡
- 2026年秋招:河南钢铁集团试题及答案
- 2026年科研诚信建设培训课件(精讲版)
- 中国人寿保险集团笔试题目
- 2026年浙江省宁波慈溪观海卫镇人民政府招聘编外13人易考易错模拟试题(共500题)试卷后附参考答案
- 2026年秋新教材教科版五年级科学上册教学计划及进度表
- (2026年秋)外研社版六年级英语上册单词默写表(汉译英)
- 2025版《广东省护理病历书写管理规范(试行)》
- 小学英语教学颜色课件
- IPC7711C7721C-2017(CN)电子组件的返工修改和维修(完整版)
- 航空活塞发动机构造第二章航空活塞发动机构造课件
- Nikon尼康D3100中文说明书
- 硬脑膜动静脉瘘课件
评论
0/150
提交评论