Django基础

一、创建数据库

1、在APP下的models创建表,django可以自动创建表,不可以自动创建数据库

class userinfo(models.Model):

    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)

2、连接数据库,在settings.py下更改数据库的配置信息和应用的APP,Django项目建成后, 默认设置了使用SQLite数据库, 在my_blog/my_blog/setting.py中可以查看和修改数据库设置:

mysql的固定格式 1 DATABASES = {
 2     ‘default‘: {
 3         ‘ENGINE‘: ‘django.db.backends.mysql‘,
 4         ‘NAME‘: ‘123‘,
 5         ‘USER‘:‘root‘,
 6         ‘PASSWORD‘:‘123456‘,
 7         ‘HOST‘:‘localhost‘,
 8         ‘PORT‘:‘3306‘,
 9     }
10 }
1 INSTALLED_APPS = [
2     ‘django.contrib.admin‘,
3     ‘django.contrib.auth‘,
4     ‘django.contrib.contenttypes‘,
5     ‘django.contrib.sessions‘,
6     ‘django.contrib.messages‘,
7     ‘django.contrib.staticfiles‘,
8     ‘web‘,
9 ]

3、运行命令

1 python manage.py makemigrations
2   (这个有时候可能会报一些让你选择的1还是2,就一直按1)
3   相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
4
5 python manage.py migrate
6
7   将该改动作用到数据库文件,比如产生table之类
 1 WARNINGS:
 2 ?: (urls.W005) URL namespace ‘admin‘ isn‘t unique.
 3 You may not be able to reverse all URLs in this namespace
 4 You are trying to add a non-nullable field ‘demo‘ to userinfo without a default;
 5  we can‘t do that (the database needs something to populate existing rows).
 6 Please select a fix:
 7  1) Provide a one-off default now (will be set on all existing rows with a null
 8 value for this column)
 9  2) Quit, and let me add a default in models.py
10 Select an option: 1
11 Please enter the default value now, as valid Python
12 The datetime and django.utils.timezone modules are available, so you can do e.g.
13  timezone.now
14 Type ‘exit‘ to exit this prompt
15 >>> 1
username = models.CharField(max_length=50)password = models.CharField(max_length=50)gender = models.BooleanField(default=False)age = models.IntegerField(default=19)memo = models.TextField(default=‘XXX‘)createdate = models.DateTimeField(default=‘2017-06-4 14:33‘)
上面之所以要选择 1,2,是因为新加入列之后,也要加入数据,所1是选择逐个添加数据,2就是用上述的方法天极爱默认值。

4、如果我现在有修改models的需要,改完之后我还需要重新执行第3步。

二、外键

1、一对多关系,此时的情况是多个用户可以使用一个身份id

 1 class userinfo(models.Model):
 2
 3     username = models.CharField(max_length=50)
 4     password = models.CharField(max_length=50)
 5     gender = models.BooleanField(default=False)
 6     age = models.IntegerField(default=19)
 7     memo = models.TextField(default=‘XXX‘)
 8     createdate = models.DateTimeField(default=‘2017-06-4 14:33‘)
 9
10     typeid = models.ForeignKey(‘usertype‘) ,usertype里有的类型我才可以去写,没有的类型保存会报错。
11
12
13 class usertype(models.Model):
14     name = models.CharField(max_length=50)

2、多对多关系,此时的情况是一个用户可以存在于多个组中,一个组中也可以拥有多个用户

 1 class group(models.Model):
 2
 3     name = models.CharField(max_length=50)
 4
 5 class user(models.Model):
 6
 7     name = models.CharField(max_length=50)
 8     email = models.CharField(max_length=50)
 9
10     group_relation = models.ManyToManyField(‘group‘)#此时这条语句会自动帮我建立三个数据库

3、一对一的关系,就是一个用户只能有一个身份证号

1 models.OneToOneField

三、一些常用的简单属性(创建数据库的操作),在models里面。

 1 class args(models.Model):
 2
 3     name = models.CharField(max_length=20,null=True)#可以为空
 4     not_name = models.CharField(max_length=20, null=False)#不可以为空
 5
 6
 7 class asset(models.Model):
 8
 9     hostname = models.CharField(max_length=256)
10     create_date = models.DateTimeField(auto_now_add=True)#永远是创建时的时间,自动创建
11     update_date = models.DateTimeField(auto_now=True)#无论添加或修改,都是当前操作的时间,自动创建
12
13
14 class userinfo_temp(models.Model):
15
16     gender_choice=(
17         (u‘1‘,u‘普通用户‘),
18         (u‘2‘,u‘管理员‘),
19         (u‘3‘,u‘超级管理员 ‘),
20     )
21
22     usertype = models.CharField(max_length=2,choices=gender_choice)#此时这个数据是存在内存中而不是存在数据库中

四、根据传进来的url,对数据库进行增、删、改、查(views)

 1 def add(request,name):#对数据库的数据的增
 2
 3     asset.objects.create(hostname=name)#hostname表示数据库的名字,name表示url返回来的值,objects,操作数据库必须要用这个    方法2:obj = asset(hostname=name)        obj.save()
 4     return HttpResponse(‘ok‘)
 5
 6 def delete(request,id):#对数据库的删,此处只能删除单个数据记录
 7
 8     asset.objects.get(id=id).delete()
 9     return HttpResponse(‘ok‘)
10
11 def update(request,id,hostname):#对数据库的改
12     ‘‘‘
13     obj = asset.objects.get(id=id)
14     obj.hostname = hostname
15     obj.save()
16     此时的数据是按单个记录修改,以下是将记录批量的修改
17     ‘‘‘
18     #将所有大于我传的id的值都修改hostname
19     asset.objects.filter(id__gt=id).update(hostname=hostname)#id后加俩下划线
20
21     return HttpResponse(‘ok‘)
22
23 def get(request,hostname):#对数据库的查
24
25
26     #asset_list = asset.objects.filter(hostname__contains=hostname)#取包含什么的数据
27
28     alldate = asset.objects.all()#取所有的数据       asset.objects.all().values(‘id‘,‘hostname‘)此时我可以通过映射只获取id和hostname的值
29
30     temp = asset.objects.all()[0:2]#获取从哪到哪的数据
31
32     orderby = asset.objects.all().order_by(‘id‘)#正序排序,’-id‘倒序排序
33     return HttpResponse(‘ok‘)

五、模板

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。

views.py1 def assetlist(request):
2     asset_list = asset.objects.all()
3
4     #将数据嵌套在html中,再将新的字符串返回给用户,参数:html是用于显示的网页,后面的参数是自己加的,加不加随便。
5     result =  render_to_response(‘assetlist.html‘,{‘data‘:asset_list,‘user‘:‘alex‘})
6     return result
 1 <body>
 2     <h1>{{ user }}</h1>#获得user的值
 3     <table border="1">
 4         {% for item in data %}#for循环
 5             <tr>
 6                 <td>{{ item.id }}</td>
 7                 <td>{{ item.hostname }}
 8                 <td>{{ item.create_date }}</td>
 9                 <td>{{ item.update_date }}</td>
10             </tr>
11         {% endfor %}#循环结束
12     </table>
13 </body>

模板语言:

 1 {{ item }}
 2 {% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
 3   forloop.counter
 4   forloop.first
 5   forloop.last
 6 {% if ordered_warranty %}  {% else %} {% endif %}
 7 母板:{% block title %}{% endblock %}
 8 子板:{% extends "base.html" %}
 9    {% block title %}{% endblock %}
10 帮助方法:
11 {{ item.event_start|date:"Y-m-d H:i:s"}}#调整时间格式
12 {{ bio|truncatewords:"30" }}#长度
13 {{ my_list|first|upper }}#第一个字符编程大写
14 {{ name|lower }}#变成小写

要是上面的帮助方法不够用,还可以自定义帮助方法。()

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 from django import template
 4 from django.utils.safestring import mark_safe
 5
 6 register = template.Library()
 7
 8 @register.simple_tag
 9 def my_simple_time(v1,v2,v3):
10     return  v1 + v2 + v3
11
12 @register.simple_tag
13 def my_input(id,arg):
14     result = "<input type=‘text‘ id=‘%s‘ class=‘%s‘ />" %(id,arg,)
15     return mark_safe(result)

c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

1 {% load xx %}

{% load oldboy %}

d、使用simple_tag

{% my_simple_time 1 2 3%}#方法+参数
{% my_input ‘id_username‘ ‘hide‘%}

母板跟子板的相关理解:个人抽象理解,上下左右四个部分,上下左都不变化,只有右变化,所以前者是母版,后者就是子板,而子板的需要继承母板即子板没有的代码。

母版例子:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <div>公用头部</div>
 9
10 <div>
11
12     {% block content %}{% endblock %}
13 </div>
14
15 <div>公用底部</div>
16
17
18 </body>
19 </html>

子板例子:

 1 {% extends "master/layout.html" %}#继承母版
 2 {% load oldboy %}#之前调用了一个特殊方法,需要载入
 3
 4
 5 {% block content %}#对应母版中的content,它写啥,母版中对应的content就是啥
 6
 7     <h1>{{ user }}</h1>
 8     <table border="1">
 9         {% for item in data %}
10             <tr>
11                 <td>{{ item.id }}</td>
12                 <td>{%   my_simple_time item.id%}
13                 <td>{{ item.create_date|date:"Y-m-d H:i:s" }}</td>
14                 <td>{{ item.update_date|date:"Y-m-d H:i:s" }}</td>
15             </tr>
16         {% endfor %}
17     </table>
18 {% endblock %}

最后一点,有的版本在自己添加帮助方法的时候可能要设置settings.py,设置其路径:

在DEBUG = TRUE 处设置1 TEMPLATE_DEBUG=True
2 TEMPLATE_DIRS=(
3     os.path.join(BASE_DIR,‘template‘)
4 )

六、框架的用户登陆和后台检测:

1 <form action="/web/login/" method="POST">
2     用户名:<input name="username"/>
3     <br/>
4     密码:<input name="password"/>
5     <br/>
6     <input type="submit" value="提交"/><span style="color:red" >{{ status }}</span>
7 </form>
 1 def login(request):
 2
 3     if request.method == ‘POST‘:
 4         user=request.POST.get(‘username‘,None)#获取登陆页面中的用户名,None防止用户名和密码错误时报错,给它返回一个none值
 5         pwd=request.POST.get(‘password‘,None)#获取密码
 6         print user,pwd
 7         #userinfo.objects.get(username=user,password=pwd)
 8         result = userinfo.objects.filter(username=user,password=pwd).count()
 9         if result == 1:
10             return HttpResponse(‘登陆成功‘)
11         else:
12             return  render_to_response(‘login.html‘,{‘status‘:‘用户名和密码错误‘})#此时回去html页面中调用帮助方法
13     else:
14         return render_to_response(‘login.html‘)

七、用户注册:

view.py

 1 def register(request):
 2
 3     regiterForm = RegisterForm()
 4
 5     if request.method == ‘POST‘:
 6
 7         form = RegisterForm(request.POST)
 8         if form.is_valid():#检验是否满足规则
 9             data = form.cleaned_data
10             print data
11         else:
12             temp = form.errors.as_data()#以下三条都是为了输出中文报错
13             print temp[‘email‘][0].messages[0]
14             print type(temp[‘email‘][0])
15
16     return render_to_response(‘register.html‘,{‘form‘:regiterForm})#此处的regiterForm是form.py下的函数

register.html

1 <form action="/web/register/" method="POST">
2     用户名:{{ form.username }}
3     <br/>
4     密码:{{ form.email }}
5     <br/>
6     <input type="submit" value="提交"/><span style="color:red" >{{ status }}</span>
7 </form>

form.py,专门用于定义注册用户需要的信息。

1 #!/usr/bin/env python
2 #coding:utf-8
3
4 from django import forms
5
6 class RegisterForm(forms.Form):
7     username = forms.CharField()
8     email = forms.EmailField(required=True,error_messages={‘invalid‘:‘邮箱格式错误‘})
时间: 2024-10-27 09:38:43

Django基础的相关文章

Python Day19-20(Django基础)

一.Django基础 1.基本配置补充 可以用pycharm一键创建工程和APP 其他常用命令: python manage.py runserver 1.1.1.1:8000 python manage.py startapp appname python manage.py syncdb python manage.py makemigrations python manage.py migrate python manage.py createsuperuser 数据库配置 setting

Django 基础教程

Django 基础教程 这是第一篇 Django 简介 ?  Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单!本教程一直在更新,从开始写到现在大概写了一年多了,现在也一直在坚持写,每一篇教程都可能随时更新,可以在网站首页看到最近更新的情况. 我阅读学习了全部的 Django英文的官方文档,觉得国内比较好的Django学习资源不多,所以决定写自己的教程.本教程开始写的时候是 Django 的版本是 1.6,

Python之路-(js正则表达式、前端页面的模板套用、Django基础)

js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 登录注册验证: test: 判断字符串是否符合规定的规则 rep = /\d+/;   (定义规则) rep.test('')   (引号里面必须包含字母和数字才返回true,否则为false) rep = /^\d+$/; (只有是纯数字时候才返回true,否则是false) exe

Django[基础知识]

Python功能最全的WEB框架:Django,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 使用Django需进行以下操作: 1.创建Django项目,创建方式有两种. a.命令操作: django-admin startproject  dg_web   //dg_web为项目名称 b.直接在开发环境IDE下进行新建django项目 创建项目之后的文件目录如下: 2.在创建的项目下建立功能程序,操作如下: 命令行:python manage.py startap

Django基础和基本使用

Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的方法: Django优点 自带轮子众多,方便快速开发 如Auth,Cache,模板等 天生的MVC设计模块 实用的后台管理 自带ORM,Template,Form,Auth核心组件 简洁的url设计 周边插件丰富 Django缺点 重 同步阻

2 Django基础

1 django目录文件 1.1 自动生成的文件和文件夹 __init__.py:告诉 Python 该目录是一个 Python 包 settings.py:Django全局配置文件 urls.py:Django路由文件 wsgi.py:(Python Web Server Gateway Interface)服务器网关接口 templates:放置HTML文件的地方 manage.py:启动Django的主要文件 1.2 使用命令新建app 首先执行:Tools > Run manage.py

Python学习之旅—Django基础

前言  前段时间业务比较繁忙,没时间更新博客,从这周开始将继续为各位更新博客.本次分享的主题是Django的基础部分,涵盖Django MTV三部分,并通过一个简单的班级管理系统来说明如何使用Django进行开发,好啦,开始今天的主题吧! 一.浅谈MVC.MTV和MVVM 要学习Django,我们很有必要了解下MVC,MTV和MVVM三种模式. [001]MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式(本文不讨论桌面应用的MVC),它把业务

Django基础之MTV模型

一.Django基础 一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型(Model).视图(View)和控制器(Controller).它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 1.mvc简介 http://blog.csdn.net/pi9n

Web框架和Django基础

核心知识点 1.web应用类似于一个socket客户端,用来接收请求 2.HTTP:规定了客户端和服务器之间的通信格式. 3.一个HTTP包含两部分,header和body,body是可选,\r\n分隔头部,\r\n\r\n分隔头部和身体. 4.WSGI:定义了用python编写的web服务程序和web应用程序的接口格式. 5.python标准库提供的独立的协议叫wsgiref,django也是使用它作为环境. 6.Django的目录结构(基本的:settings.py urls.py wsgi

Django基础01

我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen(5) while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.clo