ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

对于项目的问题

2022-05-09 11:31:26  阅读:169  来源: 互联网

标签:form 对于 pageInfo 项目 request id 问题 data page


一个项目一开始你会做什么

画思维导图,或者时序图,来构建个业务逻辑,更清晰的理解该项目的需求,然后再设计数据库,当然数据库的表关系是最后设计的,先把数据表设计出来再说,然后再看效果,是否需要增添一些字段,或者外键关联之类的。然后在敲代码实现。

项目比较常规,围绕里面用的技术

Django
Mysql


一个是query.filter_by
一个是objects.filter
Flask使用models类.query.filter_by(字段=xxx).all()来查询数据
而Django使用ats = ArticleInfo.objects.filter(aid=aid).first() # 直接用all()获取全部数据

项目中如何对数据进行增删改查

Django的增删改查

Django用户认证模块

使用模板变量传递字符串达到复用的好处
from django.contrib.auth import authenticate,login,logout
使用django.contrib.auth中的authenticate模块来进行登录验证
使用login来进行登录
使用logout来进行注销用户

def login1(request):
    pageTitle = '用户登录'
    button = '登录'
    urltext = '注册'
    urlName = 'register'
    confirmPassword = False
    if request.method == 'POST':
        u = request.POST.get('username','')
        p = request.POST.get('password','')
        user = authenticate(request,username=u,password=p)
        if user:
            login(request,user)
            return redirect('xy.html/')
        else:
            tips = '账户密码错误,请重新输入'
    else: # 用户已经登录,还点击登录
        if request.user.username: # 由于list1_name是用url传参来分页,所有重定向路由命名的话也要传入对应的参数
            # 直接重定向到index.html页面;返回404,没有这个路由
            return redirect('jj/1.html') # redirect是重定向路由,reverse是反向解析命名空间
    
    print('打印出当前的用户权限',request.user) # user是默认的么
    return render(request,'login.html',locals())

注册模块
通过request.POST.get获取表单中的字段进行异常校验(判断用户名是否重复,判断两次输入的密码是否一致),然后再写入数据库,将参数使用字典的形式写入。
使用create_user,这是特有的create语句

User.objects.create_user(**d)

然后在进行数据表的保存.save().
然后再logout(request)注销用户,返回重定向到登录界面(redirect);
以上都是对表单的请求是post请求的处理,还有get请求得话,直接返回登录界面。

def register(request):
    pageTitle = '用户注册'
    button = '注册'
    # 登录还是注册用该函数的变量进行传递
    urltext = '登录'
    urlName = 'login_name'
    confirmPassword = True # 会有人恶意频繁注册么,恶意频繁注册该怎么办,弄个验证码
    if request.method == 'POST':
        u = request.POST.get('username','')
        p = request.POST.get('password','')
        cp = request.POST.get('cp','') # cp就是确认密码标签的name属性值,用request.POST.get('cp','')来获取,那第二个参数为啥空呢
        if User.objects.filter(username=u):
            tips = '用户已存在'
        elif cp != p:
            tips = '两次密码输入不一致'
        else:
            d = {
                'username':u,'password':p, # is_staff为0的话,那么这个账户连后台都无法登录
                'is_superuser':0,'is_staff':0 # 这里更改后面注册的用户是否为超级管理员;这里能创建管理员,用django语句就无法创建了
            }
            user = User.objects.create_user(**d)
            user.save()
            tips = '注册成功,请登录'
            # 注销用户,重新返回登录页面
            logout(request) 
            return redirect('login.html')
    return render(request,'login.html',locals())

Flask用户认证模块

登录界面
获取表单数据进行验证;与Django不一样的话这里使用的是从模型表单中获取数据,不用request请求上下文

    form=forms.LoginForm1() 
    if form.validate_on_submit():
       # 获取表单类的数据直接用.data
        print('账号是:',form.name.data)
        reader=models.Reader.query.filter_by(id_r=form.name.data).first()
        if reader is None:
            flash('用户名不存在') # flash表单是什么
        elif reader.password == form.password.data:
            # print('session["user"]这个时候有么') # session['user']登录之后的固定用法,session来存储临时变量

            if reader.kind==2: # 只有kind为2的账户密码才可以返回管理员界面
                flash('你好,'+reader.name)
                return redirect('/manager')
            else:
                # print('session["user"]这个时候有么') # session['user']登录之后的固定用法,session来存储临时变量
                session['user']=reader.id_r
                flash('你好,'+reader.name)
                return redirect('/search')
        else:
            flash('密码错误')

    return render_template('login.html',form=form)

注册界面
获取注册页面的表单数据,然后先判断账号是否相同(查询数据库中是否有相同的账户id),然后再正确的写入。
这里数据库的写入是使用db.session.add(newreader),newreader为模型类的实例化。只是传入的参数是类属性(并不是实例属性,不知如何做到的)
然后再db.session.commit()

form=forms.Reader_add() # 需要加个增加相同数据的处理
if form.validate_on_submit():# .validate_on_submit()
    if models.Reader.query.filter_by(id_r=form.no.data).first(): # 存在相同id则跳转到搜索管理页面,不进行任何操作,并显示以存在相同书籍id
        flash('已存在相同读者id,请重写')
        return redirect('addreader')
    else:
        newreader= models.Reader(id_r=form.no.data,
                           name=form.name.data,
                           gender=form.gender.data,
                           kind=form.kind.data,
                           password=form.password.data,
                           phone=form.phone.data,
                           grade=form.grade.data,
                            department=form.department.data
                         )
    db.session.add(newreader)
    db.session.commit()
    flash('操作成功')
return render_template('addreader.html',form=form)

级联查询

Django级联查询

select_related根据select_related('article_tag')外键名称,然后在通过filter得到查询与标签相关的文章数据
article_tag__id中的双下划线代表的是连接外键名与一数据库字段。

# 选择符合标签的所有数据;反向查询,返回id
a = ArticleInfo.objects.select_related('article_tag').filter(article_tag__id=tag_id).order_by('-create_article').all()[:10]
else: # 不带标签传输则返回所有的前10条数据按照阅读量的排名
a = ArticleInfo.objects.select_related('article_tag').order_by('-create_article').all()[:10]

Flask级联查询

并未用到级联查询,使用的是从视图函数中传参来获取到对应的查询条件

# 归还表
a=models.Borrow.query.filter_by(reader_no=reader_no,
                                book_id=bookid).first()
# 总的书表
book=models.Book.query.filter_by(id=bookid).first()
if book is not None:
    book.available_count+=1
overday=(datetime.datetime.now()-a.return_date).days
# 删除,增加,可先后进行commit
    db.session.add(b)
    db.session.delete(a)
    db.session.commit()

Flask独有的修改删除

获取原来的数据book = models.Book.query.filter_by(id=bookid).first()
然后进行值的覆盖操作
然后在commit修改提交数据。

#修改图书
@app.route('/bookalter/<bookid>',methods=['GET','POST'])
def bookalter(bookid):
    book = models.Book.query.filter_by(id=bookid).first()
    form=forms.Book_alter()
    if form.validate_on_submit():# 不加validate_on_submit报错update更新错误
        book.id=form.id.data
        book.name=form.name.data
        book.style_num=form.style_num.data
        book.author=form.author.data
        book.count=form.count.data
        book.available_count=form.available_count.data
        book.price=form.price.data
        book.press=form.press.data
        book.publish_date=form.publish_date.data
        book.summary=form.summary.data
        db.session.commit() # 提交修改数据
        flash('操作成功')

    return render_template('bookalter.html',form=form)

删除操作
从表单中获取删除读者的id,然后进行表单权限认证form.validate_on_submit(),然后再用query.filter_by(字段=xxx).all()来查找该表单中的数据
之后再使用db.session.delete(xxx)从数据库中删除。

#删除读者
@app.route('/manager/deletereader',methods=['GET','POST'])
def deletereader():
    form=forms.Reader_delete()
    if form.validate_on_submit():# .validate_on_submit()
        reader= models.Reader.query.filter_by(no=form.no.data).first()
        if reader is None:
            flash('操作失败,读者不存在')
        else:
            borrowlist=models.Borrow.query.filter_by(reader_no=form.no.data).all()
            if borrowlist!=[]:
                flash('该读者有图书尚未归还')
                return render_template('deletereaderfail.html')
            db.session.delete(reader)
            db.session.commit()
            flash('操作成功')

    return render_template('deletereader.html',form=form)

Flask获取mysql中的数据

获取最新的数据,时间降序,对时间的值进行截取处理,limit 1,1 ;或者使用max(time)也可以

    new_trade_1 = """
            SELECT
                n.nav_unit as "单位净值"
            FROM
            fund_nav n
            where n.fund_id={}  order by n.trade_date  desc limit 1,1;
            """.format(fund_id)
    cursor.execute(new_trade_1)
    conn.commit() #提交数据
    # res0是1天前的单位净值
    res0 = cursor.fetchall()

分页操作

Django分页操作

使用Django的分页模块
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
pageInfo = paginator(总数据,展现多少个),返回个分页对象的实例
可以从路由中获取这是分页的第几页(视图函数中的参数带有page变量),然后在返回第几页的信息
分页对象的实例有个page函数可以返回第几页的数据
pageInfo = paginator.page(page)
使用PageNotAnInteger来判断传入的page变量不是一个整形,所以就跳转到第一页的数据
使用EmptyPage: # 当请求的数值不存在时触发;跳转到最后一页的数据;
最后一页的页数可以由paginator.num_pages得出

list1 = ArticleInfo.objects.all()
# print('这是什么',list1)
# 直接分页把list1是个列表传入即可
paginator = Paginator(list1,6)
try:
    pageInfo = paginator.page(page) # 从路由中获取这是分页的第几页信息
except PageNotAnInteger: # 请求不是一个整数则跳转到首页
    pageInfo = paginator.page(1)
except EmptyPage: # 当请求的数值不存在时触发;或者请求的页面是最后一项,打错了字,大多了
    # 反正跳转到最后一页
    pageInfo = paginator.page(paginator.num_pages)
return render(request,'index.html',locals())

具体在html页面上的渲染操作
pageInfo.object_list获取所有pageInfo的详细信息,并转化为列表,然后就可以渲染出多页的数据

{% for list in  pageInfo.object_list %}

具体的分页按钮
一般的显示为上一页 2 下一页 这样的样式
所以要有一个可以跳转上一页的方法或者判断,这里使用{% if pageInfo.has_previous %}来判断由上一页,然后再展示上一页的数据具体页数pageInfo.previous_page_number
进行判断当前的页数,比如要根据{% if pageInfo.number == page %}来看是否等于当前request中的page数据,然后再进行page的渲染。
下一页类似于上一页使用{% if pageInfo.has_next %},如果存在则展示下一页数据 pageInfo.next_page_number

<div class="pagelist">
  <!--分页标记居中显示样式-->
  {% if pageInfo.has_previous %}
  <a href="{% url 'list1_name' pageInfo.previous_page_number %}">上一页</a>
  {% endif %}

  {% if pageInfo.object_list %}
  {% for page in pageInfo.paginator.page_range %}
  {% if pageInfo.number == page %}

  <a href="javascript:;" class="curPage">{{ page }}</a>
  {% else %}
  <a href="{% url 'list1_name' page %}">{{ page }}</a>
  <!--这里第几页样式不居中-->
  {% endif %}
  {% endfor %}
  {% endif %}

  {% if pageInfo.has_next %}
  <a href="{% url 'list1_name' pageInfo.next_page_number %}">下一页</a>
  {% endif %}
</div>

Flask分页操作

先判断数据的长度,然后在用列表索引进行赋值给一个变量,让其进行分页展示数据

# 获取所有的数据进行分页展示
@app.route('/todo/api/v1.1/pages/<page>/')
def get_page(page):
    print(len(list_value)) # 查看多少个
    # 也可自己设定根据多少个来传参
    if page == '1': # 浏览器传入的都是str
        data = list_value[:3]
        # print("现在的data",data)
    else:
        data = list_value[3:]
        # print("现在的data",data)
    print('locals()是什么',locals())
    print(len(data))
    return render_template('index.html',data=data)

标签:form,对于,pageInfo,项目,request,id,问题,data,page
来源: https://www.cnblogs.com/wkhzwmr/p/16248526.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有