继承django后台内置auth_user的model类AbstractUser
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
...
自定义UserProfile覆盖默认的user表
注册自定义的UserProfile,在users/admin.py文件中加入
from .models import UserProfile
class UserProfileAdmin(admin.ModelAdmin):
pass
admin.site.register(UserProfile, UserProfileAdmin)
xadmin参数
- list_display,数组类型,设置后台界面要显示的model字段
- search_fields,数组,在后台界面增加搜索框,检索
- list_filter,数组,过滤器
xadmin注册model处理外键的方式
list_filter中使用类似course__name的方式,使用”__”连接外键与外表字段名
主题设置, title,footer设置
from xadmin import views
class BaseSetting:
enable_themes = True
use_boostwatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)
修改app中文名
在app如Courses文件夹下自动生成的apps.py文件中配置app
class CoursesConfig(AppConfig):
name = "courses"
verbose_name = "课程管理"
修改init.py文件,增加
default_app_config = "courses.apps.CoursesConfig"
修改register.html的css等静态文件
django template语法
使用static前需要load
{% load static %}
href="{% static 'css/reset.css' %}"
django会根据settings中的STATIC_URL设置自动修改静态文件路径
验证码插件
django-simple-captcha
from django.conf import settings
from django.urls import re_path
from django.views.static import serve
# ... the rest of your URLconf goes here ...
if settings.DEBUG:
urlpatterns += [
re_path(r'^media/(?P.*)$' , serve, {
'document_root': settings.MEDIA_ROOT,
}),
]
第三方库django-pure-pagination
具体使用方法见github文档
model中的外键在数据库中是以_id后缀形式存储字段的,如外键city在数据表中字段为city_id,可以直接使用city_id做filter
可以指定相应Model的某些字段生成Form,并且可以对字段进行合法性判断
class UserAskForm(forms.ModelForm):
class Meta:
model = UserAsk
fields = [...]
UserAskModel继承django的ModelForm,ModelForm可以定义Meta类,model参数指定Model类,fields参数指定转换为form的字段。
验证字段是否合法
定义clean_开头的方法,clean_+字段名,使用内置的cleaned_data提取字段值,进行验证。
def clean_mobile(self):
mobile = self.cleaned_data['mobile']
reg_mobile = '^1[3|4|5|7|8][0-9]{9}$'
reg = re.compile(reg_mobile)
if reg.match(mobile):
return mobile
else:
raise forms.ValidationError("手机号码非法", code="invalid mobile")
学习过该课程的用户还学过哪些课
通过UserCourse获取到学习该课程的user_ids列表,使用user_id__in=user_ids传入id列表,查询所有在id列表的UserCourse
同样的方法查询到全部关联课程
通过view实现登录权限的认证, 自定义LoginView
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class LoginRequiredMixin:
@method_decorator(login_required(login_url='/login/'))
def dispatch(self, request, *args, **kwargs):
return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
需要权限认证的View继承LoginRequiredMixin,View
class CourseLessonView(LoginRequiredMixin, View):
...
name__icontains=keyword, __icontains表示django model会转化为LIKE的SQL语句
django.db.models class Q 在检索或(|)、与(&)用于连接条件
在urls.py配置handler404、handler500
定义404和500的处理方法
handler404 = 'users.views.page_not_found'
handler500 = 'users.views.internal_error'
def page_not_found(request):
response = render_to_response('404.html')
response.status_code = 404
return response
注:hanler404与handler500的默认处理函数的template_name=’404.html’和’500.html’,只需将配置好的html文件改名为404.html和500.html,放在templates文件夹即可调用
DEBUG由True修改为False之后,django服务器不会再做静态文件的代理,不会再从配置的STATIC地址寻找静态文件
可以在settings自己指定STATIC_ROOT
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
在用户输入的内容插入特殊字符,构造SQL语句进行sql注入攻击
跨站脚本攻击(Cross Site Scripting)
在用户访问的url中插入js脚本,执行脚本获取用户Cookie等信息
防护
跨站请求伪造(Cross-site request forgery)
用户在访问服务器A的同时,访问了危险服务器B,B返回的html中带有一个指向A的url,比如一张图片的src设置了指向A的url请求,
使得用户浏览器携带访问A的seeionid去访问A,这样就进行了跨站请求伪造
class LessonInline:
model = Lesson
extra = 0
过滤数据
def queryset(self):
qs = super(CourseAdmin, self).queryset()
qs = qs.filter(is_banner=False)
return qs
统计保存model信息
def save_models(self):
obj = self.new_obj # 取到当前实例
obj.save()
if obj.course_org:
course_org = obj.course_org
course_org.courses = Course.objects.filter(course_org=course_org).count()
course_org.save()
插件DjangoUeditor
在settings配置INSTALLED_APPS
INSTALLED_APPS = [
'DjangoUeditor'
]
在model中导入UEditorField
from DjangoUeditor.models import UEditorField
...
detail = UEditorField(verbose_name="课程详情", width=600, height=300, toolbars="full", imagePath="courses/ueditor/",
filePath="courses/ueditor/", default="", upload_settings={"imageMaxSize": 1204000})
在xadmin的plugins文件增加ueditor文件,在xadmin的plugins包的init.py文件的PLUGINS参数增加ueditor插件
PLUGINS = (
...
'ueditor'
)
在adminx.py注册的Admin类添加字段style设置style_fields
class CourseAdmin:
...
style_fields = {'detail': 'ueditor'}
template文件显示富文本的地方关闭自动转义
{% autoescape off %}
...
{% endautoescape %}
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 127.0.0.1 ; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /home/spzhu/py_projects/GMOOC/gmooc/media; # 指向django的media目录
}
location /static {
alias /home/spzhu/py_projects/GMOOC/gmooc/static; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}