社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python Django开发 经验技巧总结(二)

cupyter • 5 年前 • 307 次点击  

1.模板中变量的运算

(1)加法

{{value|add:value2}}
#返回的结果是value+value2的值,假设你value为40,value2为60 ,则该表达式
#返回结果为100
  • 1
  • 2
  • 3

(2)减法

{{value|add -value2}}
#与加法的性质一样,只不过是把第二个参数变成负数进行运算,返回的结果是value-value2
#假如value=4,value2=8,则返回的结果是-4
  • 1
  • 2
  • 3

(3)乘法

{% widthratio value1 value2 value3%}
#上面的代码表示 value1/value2*value3,widthratio需要三个参数,进行乘法 只需将第二个参数等于1即可
#例: value1=10 value2=1 value3=2 返回的结果为10/1*2=20
  • 1
  • 2
  • 3

(4)除法

{% widthratio value1 value2 value3%}
#返回的结果是 (value1/value2)*value3  只需将value3等于1就能进行除法运算
#例: value1=100 value2=20 value3=1  返回的结果为 (100/20)*1=5
  • 1
  • 2
  • 3

2.getlist获取多个值

urls.py加一条路由视图:

url(r'register',views.register),
  • 1

主站views.py上加register函数:

def register(request):
    if request.method == "GET":
        return render(request,'register.html')
    elif request.method == "POST":
        v = request.POST.get('gender')
        f = request.POST.getlist('favor', '')
        c = request.POST.get('city')
        c2 = request.POST.getlist('city2')
        print(v, f, c, c2)
        return render(request, 'register.html')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

register.html的配置:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
    <link rel="stylesheet" href="/static/commons.css" />
<body>
<form action="/zhuce" method="post">


    

        <p>
            <input type="text" name="user" placeholder="用户名" />
        </p>
        <p>
            <input type="password" name="pwd" placeholder="密码" />
        </p>
        <p>
            男:<input type="radio" name="gender" value="1" />
            女:<input type="radio" name="gender" value="2"/>
            人妖: <input type="radio" name="gender" value="3" />
        </p>
        <p>
            篮球:<input type="checkbox" name="favor" value="1">
            足球:<input type="checkbox" name="favor" value="2">
            排球:<input type="checkbox" name="favor" value="3">
        </p>
        <p>
            <select name="city">
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="tj">天津</option>
            </select>
        </p>


    

         <p>
            <select name="city2" multiple> 
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="tj">天津</option>
            </select>
        </p>
        <p><input type="submit" value="提交"></p>
    </form>
    <script src="/static/jquery.min.js"></script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

后台数据
从django后台打印的post信息可以看到多选框里面的内容是列表的形式, request.POST.getlist() 可以接收到所有共享同一个name的value。

3.查询集去重distinct()方式

# 学习该课程的用户,首先获取该课程在UserCourse对应关系,然后查询UserCourse表中的所有用户,使用distinct()去重
user_courses = UserCourse.objects.filter(course=course)
print(user_courses)
user_courses = user_courses.values('user__nick_name', 'user__username', 'user__image').distinct()
print(user_courses)
  • 1
  • 2
  • 3
  • 4
  • 5

结果

<QuerySet [<UserCourse: admin 学习 Django入门基础>, <UserCourse: user 学习 Django入门基础>, <UserCourse: admin 学习 Django入门基础>]>
<QuerySet [{'user__nick_name': 'LR', 'user__username': 'admin', 'user__image':


    
 'image/2018/08/admin头像.jpg'}, {'user__nick_name': 'user', 'user__username': 'user', 'user__image': 'image/default.png'}]>
  • 1
  • 2

4.模板中的for循环计数实现自增

Django框架的模板提供了 {% for %} 标签来进行循环
例如对集合进行循环如下

{% for row in v1 %}
	<div>{{row.name}}</div>
{% endfor %}
  • 1
  • 2
  • 3

但是在Django中,并不直接支持形如"int i = 0;i<100;i++" 这样的循环,Django有自己的自增方法,假设v1内有2个元素:
(1)从1开始正向自增 结果1,2

{% for row in v1 %}
	<div>{{forloop.counter}}</div>
{% endfor %}
  • 1
  • 2
  • 3

(2)从0开始正向自增 结果0,1

{% for row in v1 %}
	<div>{{forloop.counter0}}</div>
{% endfor %}
  • 1
  • 2
  • 3

(3)自减到1 结果2,1

{% for row in v1 %}
	<div>{{forloop.revcounter}}</div>
{% endfor %}
  • 1
  • 2
  • 3

(4),自减到0 结果1,0

{% for row in v1 %}
	<div>{{forloop.revcounter0}}</div>
{% endfor %}
  • 1
  • 2
  • 3

(5)是否是最后一个 结果False,True

{% for row in v1 %}
	<div>{{forloop.last}}</div>
{% endfor %}
  • 1
  • 2
  • 3

(6)是否是第一个 结果True,False

{% for row in v1 %}
	<div>{{forloop.first}}</div>
{% endfor %}
  • 1
  • 2
  • 3

(7)如果有多层循环,返回上层循环的全部取值的结果

{% for i in v1 %}
	{% for row in v1 %}
	  <div>{{forloop.parentloop}}</div>
	{% endfor %}           
{% endfor %}
  • 1
  • 2
  • 3
  • 4
  • 5

循环结果

5.查询数据库时,按照desc倒序返回数据

按照“ id ”从小到大查询数据

projects = models.Project.objects.all().order_by("id")
  • 1

或者

projects = models.Project.objects.order_by("id")
  • 1

从大到小排序:

projects = models.Project.objects.all().order_by("-id")
  • 1

或者

projects = models.Project.objects.order_by("-id")
  • 1

6.静态文件添加背景图片

创建一个子目录来存放图片,在这个目录中,放入一张图片background.jpg 子目录
在样式表中添加

body{background:url({% static 'images/background.jpg'%}) no-repeat;background-size:100% 100%;background-size:cover;}
  • 1

重新加载http://127.0.0.1:8000/,你就会在页面上看到载入的背景图片。
背景

7.启动服务让其他电脑可访问

(1)修改 Django项目中的settings.py中的 ALLOWED_HOSTS 的值为 [*]

# 准许那些地址访问,* 表示任意地址
ALLOWED_HOSTS = ['*']
# ALLOWED_HOSTS = ['192.168.1.49', 'localhost', '127.0.0.1']
  • 1
  • 2
  • 3

(2)使用命令启动服务:

python manage.py runserver 0.0.0.0:8000
  • 1

其他的电脑可通过访问启动服务的ip和端口即可打开网页、访问项目。
※注意:开启服务的主机和申请访问的设备必须在同一局域网下,即具有相同的访问IP。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53329
 
307 次点击