1)、首先通过django-admin新建一个项目,(例如项目名为mxonline)
django-adminstartprojectmxonline运行后会出现一个mxonline的文件夹,这就是整个项目的文件夹,文件夹下的文件结构为:
2)、进入到mxonline下的settings.py文件配置数据库,我自己是这样配置的
DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':"mxonline",'USER':'root','PASSWORD':'147896321','HOST':'localhost','PORT':'3306',}}
然后通过migrate命令在数据库中会生成初始的数据表
pythonmanage.pymakemigrationspythonmanage.pymigrate注意:如果makemigrations出错,一般都是数据库配置错误,请仔细检查
3、第一个django页面
运行django
4、app的model设计
1)新建一个叫users的app,新建完成后,会出现一个和mxonline同级的users文件夹,这就是我们的users的app
pythonmanage.pystartappusers2)设计user的model(users/model.py)
#-*-coding:utf-8-*-fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportAbstractUserfromdjango.utils.encodingimportpython_2_unicode_compatiblepython_2_unicode_compatibleclassUserProfile(AbstractUser):nickname=models.CharField(max_length=16,verbose_name=u'昵称',default="")birday=models.DateField(verbose_name=u'生日',null=True,blank=True)gender=models.CharField(choices=((‘male’,u'男'),('female',u'女')),default="female")address=models.CharField(max_length=64,default="")mobile=models.CharField(max_length=11,null=True,blank=True)image=mdoels.ImageField(upload_to="image/%Y/%m",default=u'image/default.png',max_length=64)class=Meta:verbose_name="用户信息"verbose_name_plural=verbose_namedef__str__(self):returnself.username#othermodels...3)注册app,并设置AUTH_USER_MODEL
在settings.py中的INSTALLED_APP中添加users
INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','users',]AUTH_USER_MODEL="users.UserProfile"4)因为models中用到了ImageField,需要安装pillow
进入虚拟环境,安装pillow
pipinstallpillow5)同步user表到数据库
pythonmanage.pymakemigrationspythonmanage.pymigrate5、如何将多个app放到一个文件夹apps(apps所在位置为项目根目录)下:
在settings.py文件中,insertapps路径即可
首先
importsys然后在BASE_DIR后面添加apps
sys.path.insert(0,os.path.join(BASE_DIR,'apps'))6、创建后台admin的用户
1)settings.py修改
pipinstallxadmin修改settings.py中的配置
将xadmin和crispy_forms(注意这里的-改为_)加入到INSTALLED_APPS中
2)项目urls.py的修改
#fromdjango.contribimportadminimportxadminurlpatterns=[#url(r'^admin/',admin.site.urls),url(r'^xadmin/',xadmin.site.urls),]9、手动安装xadmin
1)、下载xadmin源码,xadmin的源码是保存在github上的,在github首页进行搜索,然后下载到本地
2)、新建extra_apps(第三方app)文件夹(与apps文件夹同级),并在该文件夹下新建__init__.py文件(标识为一个可被调用的包)
然后打开xadmin的源码,将里面的xadmin目录复制到extra_apps文件夹下
3)、最后在settings.py文件中将extra_apps添加到项目路径
sys.path.insert(0,os.path.join(BASE_DIR,'extra_apps'))注意:本人在手动安装后运行项目时,出现了下面的错误
然后复制到项目对应虚拟环境的目录下
我自己对应的目录为:C:\Users\Administrator\Envs\mxonline\Lib\site-packages\
再次运行项目,又出现ImportError:Nomodulenamedsix的错误,然后可以通过pipinstallsix的方式解决
pythonmanage.pymakemigrationspythonmanage.pymigrate项目终于成功启动!!!
fromdjango.contrib.auth.backendsimportModelBackendfromdjango.db.modelsimportQfrom.modelsimportUserProfileclassCustomBackend(ModelBackend):defauthenticate(self,username=None,password=None,**kwargs):try:user=UserProfile.objects.get(Q(username=username)|Q(email=username))ifuser.check_password(password):returnuserexceptExceptionase:returnNone然后在settings.py中添加:
AUTHENTICATION_BACKENDS=('users.views.CustomBackend',)
11、Django验证码django-simple-captcha的使用
1)、安装和配置
通过pipinstall快捷安装
pipinstalldjango-simple-captcha将captcha添加到settings.py文件中的INSTALLED_APPS中
同步响应的配置到数据库中(同步后数据库会新建一个名为captcha_captchastore的数据表)
pythonmanage.pymigrate最后在项目的urls.py文件中添加:
urlpatterns+=patterns('',url(r'^captcha/',include('captcha.urls')),)2)、添加到表单并在视图函数或试图类验证
添加到表单
classRegisterForm(forms.Form):password=forms.CharField(required=True,min_length=6)email=forms.EmailField()captcha=captcha=CaptchaField(error_messages={"invalid":u"验证码错误"})模板中添加以显示出验证码
验证:
classRegisterView(View):defget(self,request):register_form=RegisterForm()returnrender(request,'register.html',{'register_form':register_form})defpost(self,request):register_form=RegisterForm(request.POST)ifregister_form.is_valid():...
1)、首先配置settings.py
email_send.py
send_email_verification_code(username,'register')returnrender(request,'login.html')else:returnrender(request,'register.html',{'register_form':register_form})4)、可以看到我们发送给新用户的访问链接中是通过active/加上一个16位的随机码来访问的,所以需要在urls.py和views.py中添加相应的激活处理
urls.py
urlpatterns+=url(r'^active/(P
classActiveUserView(View):defget(self,request,active_code):all_record=EmailVerfyRecord.objects.filter(code=active_code)forrecordinall_record:email=record.emailuser=UserProfile.objects.get(email=email)user.is_active=Trueuser.save()returnrender(request,'login.html')13、模板继承:
注意:模板继承中的static标签,即使父模板中load了一次,子模板中还是要load
子模板中记得要重新加载static标签{%loadstaticfiles%}
例如某个model配置了image这个字段,用于设置用户头像,是这么定义的:
image=models.ImageField(upload_to='org/%Y%m',verbose_name=u'logo')upload_to指明了上传的路径,然后还需要在settings.py文件中,TEMPLATES添加media的配置,并设置MEDIA_URL和MEDIA_ROOT
TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[os.path.join(BASE_DIR,"templates")],'APP_DIRS':True,'OPTIONS':{'context_processors':['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages','django.core.context_processors.media',],},},]...MEDIA_URL='/media/'MEDIA_ROOT=os.path.join(BASE_DIR,'media')最后在项目的urls.py文件中做如下设置
fromorganization.viewsimportOrgViewfrommxonline.settingsimportMEDIA_ROOTurlpatterns+=url(r'^media/(P
15、jQuery提示parsererror错误的解决办法
原因:从服务端返回的json不合法,比如这样的形式,{'name':'xxxx'}。必须是双引号,{"name":"xxxx"}
这是后端返回给页面的部分代码:json文本部分使用了单引号!
classAddUserAskView(View):defpost(relf,request):userask_form=UserAskForm(request.POST)ifuserask_form.is_valid():user_ask=userask_form.save(commit=True)#UserAskForm为一个ModelForm类,相较于Form类,它可以直接提交表单数据到数据库returnHttpResponse(“{‘status’:'success'}”,content_type='application/json')else:return...ajax代码如下
结果success函数一直不执行,最后添加了error函数后,提示parseerror的异常
最后发现问题,HttpResponse()中的json文本,一定要用双引号
returnHttpResponse('{"status":"success"}',content_type='application/json')
16、404页面配置
1、设置settings.py文件中DEBUG为false
DEBUG=False2、将DEBUG模式为True的时候,django可以根据设置的STATICFILES_DIRS取到的静态文件,当设置为false后,这种访问静态文件的方式将会失效(网站部署的时候,静态文件都是通过第三方【apache、nginx等】来代理的。),为了能正常访问静态文件,可以通过配置static的访问配置url和访问函数。
1)首先在settings.py文件中,配置STATIC_ROOT
STATIC_ROOT=os.path.join(BASE_DIR,'static')2)在项目文件的urls.py文件中,添加static的urls配置
frommxonline.settingsimportSTATIC_ROOTurl(r'^static/(P
#全局404处理函数defpage_not_found(request):response=render_to_response('404.html',{})response.status_code=404returnresponse4)最后在配置url的urls.py文件中添加404页面的全局配置
handler404='users.views.page_not_found'
17、xadmin使用的图标来自第三方库awesome
18、xadmin中使用ueditor(DjangoEditor源码使用文档)
1、安装
pipinstallDjangoUeditor2、在settings.py文件中,添加DjangoUeditor到INSTALL_APPS里面
3、urls.py文件中配置url
url(r'^ueditor/',include('DjangoUeditor.urls')),4、models.py中使用,并在xadmin注册的将其添加到style_fields
models.py
fromDjangoUeditor.modelsimportUEditorFieldclassBlog(models.Model):Name=models.CharField(,max_length=100,blank=True)detail=UEditorField(u'内容',width=600,height=300,toolbars="full",imagePath="",filePath="",upload_settings={"imageMaxSize":1204000},settings={},command=None,event_handler=myEventHander(),blank=True)adminx.py
classCourseAdmin(object):...#指定在编辑状态不显示的字段exclude=['fav_nums']#添加课程时,可以直接添加章节,Lesson和CourseResource均有外键指向Courseinlines=[LessonInline,CourseResourceInline]style_fields={'detail':'ueditor'}
5、xadmin下的plugins文件夹中添加ueditor.py文件,然后在__init__.py中的PLUGINS里面添加'ueditor'
ueditor.py文件内容为:
PLUGINS=(...'sortablelist','ueditor',)6、最后需要在展示富文本的地方关掉自动转义
{%autoescapeoff%}{{course.detail}}{%endautoescape%}
19、xadmin插件开发之excel导入
1、xadmin/plugins中新建excel.py文件
excel.py
#-*-coding:utf-8-*-importxadminfromxadmin.viewsimportBaseAdminPlugin,ListAdminViewfromdjango.templateimportloader#excel导入功能classListImportExcelPlugin(BaseAdminPlugin):import_excel=Falsedefinit_request(self,*args,**kwargs):returnbool(self.import_excel)#返回True才会加载插件defblock_top_toolbar(self,context,nodes):#显示自己的htmlnodes.append(loader.render_to_string('xadmin/excel/model_list.top_toolbar.import.html',context_instance=context))xadmin.site.register_plugin(ListImportExcelPlugin,ListAdminView)2、配置对应的html模板文件
在xadmin/templates下新建excel文件夹,然后新建一个html文件,命名为
model_list.top_toolbar.import.html,
PLUGINS=(...'ueditor','excel',)4、在adminx.py文件中对应model注册的时候,设置import_excel并重写post()方法以将上传的excel文件解析,最后保存到数据库对应的表中
这是我的xadmin.py文件中添加了了导入功能的Course的处理
xlrd第三方库可以通过pipinstallxlrd来安装
20、csrf_token在html和js中写法不一样
1、js中当做模板变量应该用{{csrf_token}}