一、django基础配置
1、基本配置
创建Django工程
django-admin startproject projectname ,或者直接通过pycharm创建
创建app
cd 工程名
python manage.py startapp cmdb
setting.py 设置
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"), #如果不配置会出现js、css、图片等访问失败
)
DIRS ==> [os.path.join(BASE_DIR,'templates'),] #html模板路径
middlerware # 注释 csrf #否则请求当前页面会出现CSRF错误
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'appname', # 如果不配置会出现not in INSTALLED_APPS错误
]
ATABASES = { # 数据库配置
'default': {
'ENGINE': 'django.db.backends.mysql', # 使用mysql的时候配置,默认使用sqlit3
'NAME': 'django', # 库名称
'USER': 'glen', # 用户名
'PASSWORD': 'starcor', # 密码
'HOST': 'www.puity.com', #主机
'PORT': '3306', #端口
}
}
在APP/model.py里面添加表
class User(models.Model):
name = models.CharField(max_length=32)
email = models.CharField(max_length=64)
password = models.CharField(max_length=64)
type = models.IntegerField()
在app/admin.py里面注册表,让admin可以进行管理
from bms import models
admin.site.register(models.User)
python.exe manage.py makemigrations appname # 初始化,生成initial.py
python.exe manage.py migrate # 开始创建表
python.exe manage.py createsuperuser #创建admin,可通过http://host:port/admin来管理数据库表
2、路由与基本的交互逻辑
1、在urls.py里面设置路由
urlpatterns = [
url(r'^home_page/user_delete_(?P<uid>d+).html', views.user_delete, name="user_delete"),
url(r'^home_page/user_edit_(?P<uid>d+).html', views.user_edit, name="user_edit"),
url(r'^home_page/user_add.html', views.user_add, name="user_add"),
url(r'^home_page/group_(?P<gid>d+).html', views.detail_group, name="detail_group"),
url(r'^home_page/user_(?P<uid>d+).html', views.detail_user, name="detail_user"),
url(r'^home_page/user_list.html', views.user_list, name="user_list"),
url(r'^home_page/group_list.html', views.group_list, name="group_list"),
url(r'^login/$', views.login, name="login"),
url(r'^home_page/$', views.home_page, name="home_page"),
]
最后的name参数可以直接通过{{ name }}的方式放到模版中,可以自动帮忙渲染,不需要手动修改。
(?P<uid>d+)相当于是传递给后面函数的一个参数,名字叫uid,多个可以使用**kwargs,如果没有?P<uid>就相当于位置参数,多个可以使用*args
2、在app/views.py里面写交互逻辑
def login(request):
if request.method == "POST":
username = request.POST.get('username') # 获取post提交的表单数据
password = request.POST.get('password')
try:
db_password = models.User.objects.get(name=username).password # 通过数据库表查询密码
if password == db_password:
return render(request, 'index.html') # 返回管理界面
else:
return render(request, 'login.html', {'pwdError': '密码错误'}) # 密码错误,返回登陆界面,后面的字典需要和login.html里面的模版语言配合使用
except Exception as e:
print(e)
return render(request, 'login.html', {'nameError': '用户名错误'})
return render(request, 'login.html')
3、通过访问呢http://host:port/login/ 或 http://host:port就能访问到管理页面
3、特殊的模版语言
{% for host in hosts %} # 由于模版返回的是一个字典{‘hosts':hosts},value hosts是一个包含多个字典的列表
<tr>
<td><input type="checkbox" name="IDCheck" value="14458579642011" class="acb" /></td>
<td>{{ host.hostname }}</td>
<td>{{ host.ip }}</td>
<td>{{ host.port }}</td>
<td>{{ host.type }}</td>
<td>{{ host.group }}</td>
<td>{{ host.user }}</td>
{% if host.status == 1 %} # 还可以嵌套if else
<td>启用</td>
{% else %}
<td>停用</td>
{% endif %}
<td>
<a href="house_edit?fyID=14458579642011" class="edit">编辑</a>
<a href="javascript:del('14458579642011');">删除</a>
</td>
</tr>
{% endfor %}
# 业务请求处理做的页面渲染
return render("request", "template.html", {"k1": "v1", "k2": [11, 22, 33], "k3": {"nid": 12, "name": "aaa"})
# html页面模板语法
{{ k1 }}
{{ k2.0 }} # 取列表中的第一个值,通过.获取
{{ k3.name }} # 取字典中对应key的值
# for循环
{% for k,v in k3.items %}
{{ k }} - {{ v }}
{% endfor %}
{% for item in k2 %}
{{ item }},
{{ forloop.counter }}, # 索引,从1开始,类似于python中的enumerate,
{{ forloop.counter0 }}, # 索引,从0开始,类似于python中的enumerate,
{{ forloop.first }}, # 判断当前item是否是第一个元素,成立为True,不成立为False
{{ forloop.last }}, # 判断当前item是否是最后一个元素,成立为True,不成立为False
{{ forloop.revcounter }} # 倒序索引,与forloop.counter 相反
{% endfor %}
内置函数
{{ k1|lower }} # 将所有字母都变为小写
{{ k1|first|upper }} # 将首字母变为大写
{{ k1|truncatewords:"30" }} # 取变量k1的前30个字符
{{ item.createTime|date:"Y-m-d H:i:s" }} # 将时间转为对应格式显示
4、用户数据
获取用户请求中的数据:
request.POST.get() #如果参数只有一个值直接使用get获取
request.GET.get()
reqeust.FILES.get()
# checkbox, # 如果是复选框则需要使用getlist
........getlist()
request.path_info # 获取用户的uri
文件对象 = reqeust.FILES.get()
文件对象.name
文件对象.size
文件对象.chunks()
# <form 特殊的设置></form>
给用户返回数据:
render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
redirect("URL") # 重定向
HttpResponse(字符串) # 直接返回字符串,一般使用返回json
5、ORM
增
models.User.objects.create(name='qianxiaohu',age=18)
dic = {'name': 'xx', 'age': 19}
models.User.objects.create(**dic)
obj = models.User(name='qianxiaohu',age=18)
obj.save()
删
models.User.objects.filter(id=1).delete()
改
models.User.objects.filter(id__gt=1).update(name='alex',age=84) # id__gt=1 id大于1
dic = {'name': 'xx', 'age': 19}
models.User.objects.filter(id__gt=1).update(**dic)
查
models.User.objects.filter(id=1,name='root')
models.User.objects.filter(id__gt=1,name='root')
models.User.objects.filter(id__lt=1) # id小与1
models.User.objects.filter(id__gte=1) # id大于等于1
models.User.objects.filter(id__lte=1) # id小与等于1
models.User.objects.filter(id=1,name='root')
dic = {'name': 'xx', 'age__gt': 19}
models.User.objects.filter(**dic)
v1 = models.Business.objects.all()
# QuerySet ,内部元素都是对象
# QuerySet ,内部元素都是字典
v2 = models.Business.objects.all().values('id','caption')
# QuerySet ,内部元素都是元组
v3 = models.Business.objects.all().values_list('id','caption')
# 获取到的一个对象,如果不存在就报错
models.Business.objects.get(id=1)
对象或者None = models.Business.objects.filter(id=1).first()
外键:
v = models.Host.objects.filter(nid__gt=0)
v[0].b.caption ----> 通过.进行跨表
外键:
class UserType(models.Model):
caption = models.CharField(max_length=32)
class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)
user_type = models.ForeignKey("UserType",to_field='id') # 约束,
多对多
方式一:自定义关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
class Application(models.Model):
name = models.CharField(max_length=32)
class HostToApp(models.Model):
hobj = models.ForeignKey(to='Host',to_field='nid')
aobj = models.ForeignKey(to='Application',to_field='id')
方式二:自动创建关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField("Host")
无法直接对第三张表进行操作
obj = Application.objects.get(id=1)
obj.name
# 第三张表操作
obj.r.add(1)
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])
obj.r.remove(1)
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])
obj.r.clear() # 清空id=1应用对用的记录
obj.r.set([3,5,7])
# 所有相关的主机对象“列表” QuerySet
obj.r.all()