Django_练习二

一、知识点url终止符/单表数据的三种方式

  • url后加终止符防止正则匹配的唯一性
from django.conf.urls import url
from django.contrib import admin
from cm import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #防止截胡
    url(r'^business$',views.business),
]
  • 获取单表数据的三种方式
    all / values / values_list

all相当于select * from 表 返回的Queryset类型,Queryset中包含的是表每一行返回的对象

# Queryset[obj(字段),obj,obj]
obj = models.表.objects.all()
#调用方法是循环出每个对象,调用他们的字段(属性)

values相当于select 字段 from 表 返回的Queryset类型,Queryset中包含的是每一行数据字典的形式返回k代值字段,v代值数据

# Queryset[{caption:'测试'},{},{}]
#select caption from business
v = models.Business.objects.values('caption')
#调用循环出字典,使用字典.k 显示v

values_list相当于select 字段 from 表 返回的Queryset类型,Queryset中包含的是每一行数据元组的形式返回字段数据

# Queryset[(1,运维部),(),()]
vv = models.Business.objects.values_list('caption')
#调用的时候通过元组取值用脚标的方法
  • 获取跨表数据非对象取值
    两个表关联时,不用对象取值单一的取另一个表的字段时用__字段(双下滑线加字段)
host 关联business
#b__coption直接调用b对象的coption字段queryset[{'b__coption:值}]
#对应在html调用时.b__coptin
v = models.Host.objects.values('b__coption')

#被关联对象通过关联对象类名__字段
v = models.Business.objects.filter(host__nid=1).values('caption')

二、练习

(1)、创建文件夹名为cm的app文件
python manage.py startapp cm

(2)、在setting.py配置
1、创建静态文件,先创建static文件目录,在setting.py中添加static路径
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)注:结尾逗号
2、加入cm模块为了model.py的创建
INSTALLED_APPS = ['cm']
3、配置mysql连接

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cmtest',
        'USER':'root',
        'PASSWORD':'root',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

(3)、 在__init__.py创建数据库连接

import pymysql
pymysql.install_as_MySQLdb()

(4)、创建models.py
知识点:
创建表时会默认创建自增列id字段
创建两个表的字段关系用ForeignKey
ForeignKey的变量名实际是关联表的对象,实际字段是变量名_id

1.编写models.py

from django.db import models

# Create your models here.
class Business(models.Model):
    #id不写默认自增
    caption = models.CharField(max_length=32)

class Host(models.Model):
    nid = models.AutoField(primary_key=True)
    hostname = models.CharField(max_length=32, db_index=True)
    ip = models.GenericIPAddressField(db_index=True)
    port = models.IntegerField()
    b = models.ForeignKey('Business', to_field='id')

2.python manage.py makemigrations
3.python manage.py migrate

(5)编写url.py
知识点$终止符防止截胡

from django.conf.urls import url
from django.contrib import admin
from cm import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #url 对应函数跳转
    url(r'^business$',views.business),

]

(6)编写views

def business(request):
    if request.method == 'GET':
        # Queryset[obj(id,caption,code),obj,obj]
        obj = models.Business.objects.all()

        # Queryset[{caption:'测试'},{},{}]
        #select caption from business
        v = models.Business.objects.values('caption')

        ## Queryset[(1,运维部),(),()]
        vv = models.Business.objects.values_list('caption')
        return render(request,'business.html',{'obj':obj,'obj1':v,'obj2':vv})

(7)编写templates




    
    Title


    

业务线

    {% for i in obj %}
  • {{ i.id }}-{{ i.caption }}
  • {% endfor %}

业务线字典

    {% for i in obj1 %}
  • {{ i.caption }}
  • {% endfor %}

业务线元组

    {% for i in obj2 %}
  • {{ i.0 }}
  • {% endfor %}

(8)页面效果展示


image.png

(9)页面计数forloop

forloop.counter        从1开始
forloop.counter0       从0开始
forloop.recounter0     倒叙从0
forloop.recounter      倒叙
forloop.last           是否是最后
forloop.first          是否是第一个 
forloop.parentloop     嵌套循环使用

                                        页面展示
image.png

model.py

def host(request):
    if request.method == 'GET':
        # Queryset[obj(id,caption,code),obj,obj]
        obj = models.Host.objects.all()
        b_name = models.Business.objects.all()
        return render(request,'host.html',{'obj':obj,'b': b_name})
    elif request.method =='POST':
        h = request.POST.get('hostname')
        i = request.POST.get('ip')
        p = request.POST.get('port')
        b_id = request.POST.get('b_name')

        models.Host.objects.create(
            hostname=h,
            ip= i,
            port=p,
            b_id=b_id
        )
        return  redirect('/host')

html




    
    Title
    



    

业务线

    {% for i in obj %}
  • {{ forloop.counter }}{{ i.hostname }}-{{ i.ip }}-{{i.port }}-{{ i.b.caption }}
  • {% endfor %}

你可能感兴趣的:(Django_练习二)