1、安装django,版本等于1.9,安装python的mysql驱动
pip install django==1.9
yum -y install mysql-devel gcc python-devel安装mysql-python需要的依赖
pip install mysql-python
2、添加项目后对settings修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "mxonline",
'USER': "root",
"PASSWORD": "123456",
"HOST": '127.0.0.1'
}
}
3、安装mariadb,并且修改字符集
yum -y install mariadb-server mariadb
vim /etc/my.cnf
在mysqld下添加 character_set_server = utf8
4、进行数据迁移,pycharm点击Tools->Run manage.py Tasks
makemigrations
migrate
5、开始app
startapp users
6、添加自定义用户model
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
自定义字段
7、设置认证model,安装应用
在settings 加上 AUTH_USER_MODEL = 'users.UserProfile' 即可将本身系统自带的认证设置为自定义认证
在settings 中的 INSTALLED_APPS 后追加 appname 即可将应用安装
8、当把多个app放到一个工程根目录下的文件夹后,编辑器的语法不能再检测到在应用中import到的包,如果用的是pycharm,则可以将这个目录使用右键->mark directory as->sources root 这样编辑器便会识别,不再报错
这个目录使用右键->mark directory as->sources root
但是这样做了以后,只是编辑器会识别,如果运行server,还是不能真正的运行,则需要在settings文件里边添加如下设置:
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
9、在manage.py 执行任务,使用createsuperuser来创建django的用来登陆admin用户
10、使用django-admin的时候,在settings中的多语言设置中,可以设置为中文
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
11、在admin中注册已经写好的model,如下,将user app中的UserProfile注册到admin中
from .models import UserProfile
class UserProfileAdmin(admin.ModelAdmin):
pass
admin.site.register(UserProfile, UserProfileAdmin)
12、一个bug,在某些django版本中,使用自定义User后,在创建用户的时候,数据库中的django_admin_log不能正确的写入,原因是,这个表中有一个外键约束,针对的是auth_user表,但所由于自定义了User,使用的是自定义用户,则外键约束失败,解决方法是,删除外键约束,然后重新添加一个针对自定义User表id的约束即可
CONSTRAINT django_admin_log_user_id_c564eba6_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES users_userprofile (id)
13、安装xadmin
pip install/uninstall xadmin
在settings中把xadmin和xadmin的依赖安装进去
crispy_forms xadmin
在urls.py中使用xadmin替换admim
import xadmin
url(r'^xadmin/', xadmin.site.urls),
14、源码安装xadmin
在github上搜索xadmin,第一个结果就是,下载以后解压放到项目根目录下,然后新建一个extra_apps,用来存放第三方的应用,把xadmin放进去。然后mark directory as sources root,这样也可以,但是要记住,每当mark 一个文件夹以后,必须在settings中添加BASE_DIR。
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
15、注册使用xadmin,在app下新建文件adminx.py,然后写入以下内容
import xadmin
from .models import EmailVerifyRecord
class EmailVerifyRecordAdmin(object):
list_display = ['id', 'code', 'email', 'send_type', 'send_time']
此项决定了在xadmin中查看记录的时候显示的子段
search_fields = ['id', 'code', 'email', 'send_type']
此项决定了在xadmin中那些子段可以被搜索
list_filter = ['code', 'email', 'send_type', 'send_time']
此项决定了在xadmin中那些子段可以被过滤
xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
16、xadmin的全局设置,在随便一个adminx设置即可
from xadmin import views
class BaseSetting(object):
# 主题功能,第一个是开启主题,第二个是使用其他主题
enable_themes = True
use_bootswatch = True
# 要进行注册才生效
xadmin.site.register(views.BaseAdminView, BaseSetting)
class GlobalSettings(object):
# 修改页面页头和页脚文字,设置菜单类型为收缩类型
site_title = u'在线教学网'
site_footer = u'在线教学网'
menu_style = 'accordion'
# 要进行注册才生效
xadmin.site.register(views.CommAdminView, GlobalSettings)
在设置了menu_style以后,菜单显示为英文,这是因为没有配置app的名称
在app对应的文件夹下,打开apps.py 文件,在对于的class下加入 verbose_name = u'用户操作'
class OrganizationConfig(AppConfig):
name = 'organization'
verbose_name = u'用户操作'
在app对于的文件夹下,打开__init__.py文件,在第一行加入
default_app_config = "organization.apps.OrganizationConfig"
17、将静态页面直接返回
在urls.py配置
from django.views.generic import TemplateView
urlpatterns = [
url('^$', TemplateView.as_view(template_name="index.html"), name="")
]
18、配置静态文件的位置
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static")
)
19、配置自定义验证,使其支持邮箱验证
settings.py +++
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend'
)
views.py +++
from django.db.models import Q
from django.contrib.auth.backends import ModelBackend
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
20、配置使用url和static标签
{% url 'index' %} 其中 index 代表在urls.py中配置的name项目
{% static 'css/index.css' %} 其中 css/index.css代表与配置文件中设置的STATIC_URL的相对路径
在使用此标签,必须在页面前边加上{% load staticfiles %}
21、安装验证码
pip install django-simple-captcha==0.4.6
settings.py +++
INSTALLED_APPS 中加入captcha
urls.py +++
url(r'^captcha/', include('captcha.urls')),
运行manage.py ,makemigrations、migrate
在forms.py中加入
from captcha.fields import CaptchaField
captcha = CaptchaField()
在views.py 中加入
from .forms import RegisterForm
在views.py 中对于的方法中加入
captcha_form = RegisterForm(error_messages={'invalid': u'验证码出错'}) # 括号中error_messages是自定义报错信息的
然后将captcha_form 渲染到前端,然后在前端使用{{ captcha_form.captcha }}
22、配置使用input 的文件标签来进行上传的文件的保存地址
settings.py +++
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
23、配置在模板中使用{{ MEDIA_URL }}
settings.py +++ 这样在模板中才认识{{ MEDIA_URL }}
TEMPLATES>OPTIONS>context_processors 增加
'django.core.context_processors.media',
urls.py +++
from django.views.static import serve
from muxue.settings import MEDIA_ROOT
url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),
24、django的分页功能配置
pip install django_pure_pagination
settings.py +++
INSTALLED_APPS = (
...
'pure_pagination',
)
settings.py +++
PAGINATION_SETTINGS = {
'PAGE_RANGE_DISPLAYED': 4,
'MARGIN_PAGES_DISPLAYED': 1,
'SHOW_FIRST_PAGE_WHEN_INVALID': True,
}
其他代码参照github上的教程
https://github.com/jamespacileo/django-pure-pagination
25、数据库操作
排序并限制取的个数 all_org.order_by("-click_nums")[:3]
26、模板操作
for 循环中,使用 {{ forloop.counter }}或者 {{ forloop.counter0 }}来取得for循环的递增数
27、djang ModelForm
forms.py +++
from django.forms import ModelForm
from operation.models import UserAsk
class UserAskModelForm(ModelForm):
class Meta:
model = UserAsk
fields = ['name', 'mobile', 'course_name']
views.py +++
from organization.forms import UserAskModelForm
user_ask_form = UserAskModelForm(request.POST)
if user_ask_form.is_valid():
user_ask = user_ask_form.save(commit=True)
return HttpResponse(simplejson.dumps(data, ensure_ascii=False), content_type='application/json')
28、自定义正则验证手机号
forms.py +++
class UserAskModelForm(forms.ModelForm):
class Meta:
model = UserAsk
fields = ['name', 'mobile', 'course_name']
def clean_mobile(self):
mobile = self.cleaned_data['mobile']
regex_mobile = "^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"
p = re.compile(regex_mobile)
if p.match(mobile):
return mobile
else:
raise forms.ValidationError(u"手机号码非法", code="mobile invalid!")
29、django中使用ajax之csrf添加.(没有form的情况下不能将csrf_token放进去)
function add_fav(current_elem, fav_id, fav_type){
$.ajax({
cache: false,
type: "POST",
url:"/org/add_fav/",
data:{'fav_id':fav_id, 'fav_type':fav_type},
async: true,
beforeSend:function(xhr, settings){
xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
},
success: function(data) {
if(data.status == 'fail'){
if(data.msg == '用户未登录'){
window.location.href="login.html";
}else{
alert(data.msg)
}
}else if(data.status == 'success'){
current_elem.text(data.msg)
}
},
});
}
30、django中使用返回json
return HttpResponse(simplejson.dumps(data, ensure_ascii=False), content_type='application/json')
31、在django中前端模板中显示model中的选择性字段,让其显示非数据库中保存的内容。
比如在model中设置的是
COURSE_DEGREE_CHOICES = (('primary', u'初级'), ('middle', u'中级'),('high', u'高级'))
degree = models.CharField(max_length=10, choices=COURSE_DEGREE_CHOICES, verbose_name=u'难度')
想要在前端页面显示初级,中级,高级字段,而不是显示primary、middle、high,在模板中使用{{ course.get_degree_display }}
32、在model中加入自定义函数来返回外键的数量,然后在模板中调用此函数
def get_lesson_numbers(self):
return self.lesson_set.all().count() # 其中lesson类中,此类是lession的外键。
模板中使用 {{ course.get_lesson_numbers }}来显示
33、用filter 查找满足多个值的记录
user_id = [1, 2, 3, 4, 5, 6, 7]
all_user_courses = UserCourse.objects.filter(user_id__in=user_id)
双下划线加in 后边加上数组,即可查出所有满足条件的记录
34、在django模板文件中使用请求的链接uri
{% if request.path | slice '7' == '/course' %}
{% endif %}
这个判断如果uri 前7位是/course 的话,就显示代码块中的内容
35、django 中orm 操作数据库like查询
all_courses = all_courses.filter(name__icontains=search_keywords) name字段like查询
36、diango 中 用Q 来进行查询
all_courses = all_courses.filter(Q(name__icontains=search_keywords)|Q(detail__icontains=search_keywords) name字段like查询 或者 detail字段like查询
37、django 模板中如果为空设置默认值
{{ request.user.mobile | default_if_none: '' }} 这样如果是在数据库中是None,则在模板中不会显示None
38、django 中异步修改头像这种文件
新建一个modelform
class UploadImageForm(forms.ModelForm):
class Meta:
model = UserProfile
filelds = ['image']
在view中使用,其中instance=request.user代表要修改的实例,如果不加,则代表新建一个
image_form = UploadImageForm(requets.POST, request.FILES, instance=request.user)
if image_form.is_valid():
image_form.save()
39、当使用class作为View的逻辑处理,而不是函数时,如何做登录验证,如果用函数是用@login_required
在apps下的utils包中,新建一个文件mixin_utils.py
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class LoginRequiredMixin(object):
@method_decorator(login_required(login_url='/login'))
def dispatch(self, request, *args, **kwargs):
return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
在需要做是否登录验证的class中,继承
from utils.mixin_utils import LoginRequiredMixin
class CommentsView(LoginRequiredMixin, View):
pass
40、当debug模式设置为False的时候,以前在使用{% static %}的情况就不能继续使用
需配置在settings中
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
需配置在url中
from MxOnline.settings import STATIC_ROOT
url(r'^static/(?P<path>.*)$', serve, {"document_root":STATIC_ROOT}),
41、配置全局404和500页面
在任意view.py中加入一个函数
def page_not_found(request):
from django.shortcuts import render_to_response
response = render_to_response('404.html',{})
response.status_code = 404
return response
关闭debug模式,将ALLOWED_HOSTS = ['*'] 在settings文件中设置
在urls.py文件中加入:
handler404 = 'users.views.page_not_fount' 其中users为写入函数所在的app中
42、模板中判断是否能被一个数整除
{% if forloop.counter | divisibleby:5 &} five {% endif %}
43、模板中给一个数值加指定值
{{ forloop.counter|add:2 }}
44、在方法中返回地址重定向
from django.core.urlresolvers import reverse
return HttpResponseRedirect(reverse("index"))
网友评论