用户地址界面:先从用户地址信息开始实现
定义用户地址视图
classAddressView(View):"""用户地址"""defget(self,request):"""提供用户地址页面"""returnrender(request,'user_center_site.html')defpost(self,request):"""修改地址信息"""pass
URL正则匹配
url(r'^address$',views.AddressView.as_view(),name='address'),
问题:
render()函数:参数1传request,所以模板中可以拿到user对象,不需要在上下文中构造
defpost(self,request):"""修改地址信息"""#接收地址表单数据user=request.userrecv_name=request.POST.get("recv_name")addr=request.POST.get("addr")zip_code=request.POST.get("zip_code")recv_mobile=request.POST.get("recv_mobile")#参数校验ifall([recv_name,addr,zip_code,recv_mobile]):#address=Address(#user=user,#receiver_name=recv_name,#detail_addr=addr,#zip_code=zip_code,#receiver_mobile=recv_mobile#)#address.save()#保存地址信息到数据库Address.objects.create(user=user,receiver_name=recv_name,detail_addr=addr,zip_code=zip_code,receiver_mobile=recv_mobile)returnredirect(reverse("users:address"))
发送get请求,获取个人中心界面
提示:settings.py文件已经配置CACHES选项的default
#缓存CACHES={"default":{"BACKEND":"django_redis.cache.RedisCache","LOCATION":"redis://192.168.243.193:6379/5","OPTIONS":{"CLIENT_CLASS":"django_redis.client.DefaultClient",}}}浏览记录查询
提示:目前没有浏览记录,所以查询的是空的浏览记录
FastDFS上传和下载工作流程介绍
文件检索的索引介绍
1.程序猿需要配置的文件:client.conftracker.confstorage.confnginx.conf
sudovim/etc/fdfs/tracker.confsudovim/etc/fdfs/storage.confsudovim/etc/fdfs/client.confsudovim/usr/local/nginx/conf/nginx.conf
2.需要启动的:tracker,storage,nginx
sudoservicefdfs_trackerdstart或者sudo/etc/init.d/fdfs_trackerdstartsudoservicefdfs_storagedstart或者sudo/etc/init.d/fdfs_storagedstartsudo/usr/local/nginx/sbin/nginx3.参考课件:FastDFS分布式存储服务器安装.docx
提示:fdfs_client-py-master.zip已经下载成功,建议使用课件提供的压缩包
进入到fdfs_client-py-master.zip目录pipinstallfdfs_client-py-master.zip
1.自定义文件存储系统的目录结构
2.Django项目中,使用client.conf文件注意点
3.settings.py中指定文件存储系统类,指定为自定义的文件存储系统类
fromdjango.core.files.storageimportStorageclassFastDFSStorage(Storage):"""自定义Django存储系统的类"""pass
#配置Django自定义的存储系统DEFAULT_FILE_STORAGE='utils.fastdfs.storage.FastDFSStorage'
4.自定义文件存储系统类代码实现
5.自定义文件存储系统代码优化部分
需求:使用后台站点,向goods应用中的GoodsCategory模型中发布内容
步骤:
1.本地化
LANGUAGE_CODE='zh-Hans'TIME_ZONE='Asia/Shanghai'
2.注册模型类到后台站点
fromdjango.contribimportadminfromgoods.modelsimportGoodsCategory,Goods,GoodsSKU#Registeryourmodelshere.admin.site.register(GoodsCategory)admin.site.register(Goods)admin.site.register(GoodsSKU)3.创建超级管理员并登陆进入到后台站点
pythonmanage.pycreatesuperuser4.发布GoodsCategory模型中的内容
没有mutagen和requests模块
链接FastFDS服务器失败
重新启动tracker和storage和nginx即可
sudoservicefdfs_trackerdstart或者sudo/etc/init.d/fdfs_trackerdstartsudoservicefdfs_storagedstart或者sudo/etc/init.d/fdfs_storagedstartsudo/usr/local/nginx/sbin/nginx
富文本编辑器在后台站点的展示效果
富文本字段:HTMLField
#富文本编辑器字段fromtinymce.modelsimportHTMLField
pipinstalldjango-tinymce==2.6.0
安装富文本编辑器应用
INSTALLED_APPS=(...'tinymce',)settings.py中添加编辑器配置
TINYMCE_DEFAULT_CONFIG={'theme':'advanced',#丰富样式'width':600,'height':400,}
项目/urls.py中配置编辑器url
登陆用户访问主页
访问静态页面
访问动态页面
逻辑:
如果没有缓存数据,就查询数据库
1.安装haystack应用
INSTALLED_APPS=(...'haystack',)2.在settings.py文件中配置搜索引擎
#配置搜索引擎后端HAYSTACK_CONNECTIONS={'default':{#使用whoosh引擎:提示,如果不需要使用jieba框架实现分词,就使用whoosh_backend'ENGINE':'haystack.backends.whoosh_cn_backend.WhooshEngine',#索引文件路径'PATH':os.path.join(BASE_DIR,'whoosh_index'),}}#当添加、修改、删除数据时,自动生成索引HAYSTACK_SIGNAL_PROCESSOR='haystack.signals.RealtimeSignalProcessor'定义商品索引类在要建立索引的表对应的应用下,创建search_indexes.py文件
定义商品索引类GoodsSKUIndex(),继承自indexes.SearchIndex和indexes.Indexable
fromhaystackimportindexesfromgoods.modelsimportGoodsSKUclassGoodsSKUIndex(indexes.SearchIndex,indexes.Indexable):"""建立索引时被使用的类"""text=indexes.CharField(document=True,use_template=True)defget_model(self):"""从哪个表中查询"""returnGoodsSKUdefindex_queryset(self,using=None):"""返回要建立索引的数据"""returnself.get_model().objects.all()指定要建立索引的字段在templates下面新建目录search/indexes/应用名
在新建目录下,创建goodssku_text.txt,并编辑要建立索引的字段,如下图
接收关键字:q
importhaystack.urlsurl(r'^search/',include(haystack.urls)),测试搜索效果,接收结果全文检索结果:
传递的上下文包括:
search.html编写,类似商品列表页面
2.创建ChineseAnalyzer.py文件
importjiebafromwhoosh.analysisimportTokenizer,TokenclassChineseTokenizer(Tokenizer):def__call__(self,value,positions=False,chars=False,keeporiginal=False,removestops=True,start_pos=0,start_char=0,mode='',**kwargs):t=Token(positions,chars,removestops=removestops,mode=mode,**kwargs)seglist=jieba.cut(value,cut_all=True)forwinseglist:t.original=t.text=wt.boost=1.0ifpositions:t.pos=start_pos+value.find(w)ifchars:t.startchar=start_char+value.find(w)t.endchar=start_char+value.find(w)+len(w)yieldtdefChineseAnalyzer():returnChineseTokenizer()