文章目录
HTML
html字符串解析为html代码
<p class="explaination_box" style="white-space: pre-line">
{% autoescape off %}
{{ tag.explaination }}
{% endautoescape %}
</p>
遍历相关
访问循环的次数
- 从1开始计数
{% for item in list %}
...
{{ forloop.counter }}
...
{% endfor %}
- 从0开始计数
{% for item in list %}
...
{{ forloop.counter0 }}
...
{% endfor %}
判断是否是第一次循环
{% for item in list %}
...
{% if forloop.first %}
This is the first round.
{% endif %}
...
{% endfor %}
判断是否是最后一次循环
{% for item in list %}
...
{% if forloop.last %}
This is the last round.
{% endif %}
...
{% endfor %}
###逆向循环
{% for item in list reversed %}
{{ item }}
{% endfor %}
当列表为空或者非空时执行不同操作
{% for item in list %}
...
{% empty %}
...
{% endfor %}
遍历中索引
<div class="layui-collapse">
{% for accordion in accordions %}
<div class="layui-colla-item">
<h2 class="layui-colla-title">{{ accordion.0 }}</h2>
<div class="layui-colla-content layui-show">{{ accordion.1 }}</div>
</div>
{% endfor %}
</div>
数据库
django时间转化
django的时间存储都是UTC时间, 如果要查看当地时间还要进行转换
#这个 now 属于 aware_time
from django.utils.timezone import now as now_func,localtime
localtime = localtime([utc_time]).strftime("%Y/%m/%d %H:%M:%S")
备份与还原
备份
- 备份某个APP中的所有数据
python manage.py dumpdata question_bank --format=json > question_bank.json
- 备份某个APP中的某个表单
python manage.py dumpdata mands_auth.user --format=json > mands_auth_user.json
还原
python manage.py loaddata /Users/zhuyewen/fsdownload/question_bank.json
转换
model 转换为dict
- 先在model中定义
to_dict
的方法
from django.db.models.fields import DateTimeField
from django.db.models.fields.related import ManyToManyField
class Nsfc(models.Model):
....
def to_dict(self, fields=None, exclude=None):
data = {}
for f in self._meta.concrete_fields + self._meta.many_to_many:
value = f.value_from_object(self)
if fields and f.name not in fields:
continue
if exclude and f.name in exclude:
continue
if isinstance(f, ManyToManyField):
value = [i.id for i in value] if self.pk else None
if isinstance(f, DateTimeField):
value = value.strftime('%Y-%m-%d %H:%M:%S') if value else None
data[f.name] = value
return data
- 然后使用
for i in page_obj:
print(i.to_dict())
查询
聚合函数
# 使用前需先导入聚合类:
from django.db.models import Sum,Count,Max,Min,Avg
# 例:查询所有学生的数目。select count(*) from student;
Student.objects.aggregate(Count('id'))
{'id__count': 5} #注意返回值类型及键名
#例:查询所有学生年龄和。
Student.objects.aggregate(Sum(‘age’))
{‘age__sum’:120} #注意返回值类型及键名
or and not
- | = or
Q(question__startswith='Who') | Q(question__startswith='What')
- ~ = not
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
- & = and
(Q(question__startswith=‘Who’) & ~Q(pub_date__year=2005))
新项目部署
创建超级用户
- 用户工厂函数中,一定要申明REQUIRED_FIELDS,如下图所示. 否则会出现创建超级用户失败
class User(AbstractBaseUser,PermissionsMixin):
#不使用默认的自增长主键
#使用 shortuuid 作为主键 pip install django-shortuuidfield
uid = ShortUUIDField(primary_key=True) #uid
email = models.EmailField(unique=True,max_length=100,null=True) #邮箱
username = models.CharField(max_length=100) #姓名
USERNAME_FIELD = 'username'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = ['email']
objects = UserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
- 这样创建后,每次运行会提示,username不是唯一的,确定吗? 这时只需要注释掉一部分和更改为email即可,如下图所示
class User(AbstractBaseUser,PermissionsMixin):
#不使用默认的自增长主键
#使用 shortuuid 作为主键 pip install django-shortuuidfield
uid = ShortUUIDField(primary_key=True) #uid
email = models.EmailField(unique=True,max_length=100,null=True) #邮箱
username = models.CharField(max_length=100) #姓名
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
# REQUIRED_FIELDS = ['email']
objects = UserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
用户验证
- 在setting中指定验证模型
要想使用 user_auth 功能,必须在 setting 中指定AUTH_USER_MODEL
users:你的app
UserProfile:model
如下图所示:
AUTH_USER_MODEL = 'mecube_auth.User'
- 在setting中指定验证方法
# 重写登录验证方式
AUTHENTICATION_BACKENDS = (
'apps.mecube_auth.views.CustomBackend',
)
- 在apps.mands_auth.views中重写验证方法的对象:CustomBackend
class CustomBackend(ModelBackend):
def authenticate(self, request, email=None, password=None,pk=None, **kwargs):
try:
user = User.objects.get(Q(email=email)) #用邮箱决定用户 如果写成user = User.objects.get(Q(email=email)|Q(username=username)) 则可以同时实线邮箱登录和用户名登录
if user.check_password(password): #查验密码
return user
except:
print('第一种方式验证失败')
try:
user = User.objects.get(pk=pk)
if user:
return user
except:
print('第二种方式验证失败')
return None
- 验证登录
def login_view(request):
email = request.POST.get("email")
password = request.POST.get("pswd")
print(email, password)
user = CustomBackend().authenticate(request, email=email, password=password)
if user:
if user.is_active:
login(request, user) # 登录成功
return restful.ok()
else:
return restful.params_error('帐号已被冻结')
else:
print('帐号或密码错误')
return restful.params_error('帐号密码错误')