DJANGO

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('帐号密码错误')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行医冶文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值