首页 > 代码库 > Django基础

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 isnt 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 cant 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         (u1,u普通用户),
18         (u2,u管理员),
19         (u3,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.py
1
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=http://www.mamicode.com/"提交"/><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 =http://www.mamicode.com/ 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=http://www.mamicode.com/"提交"/><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:邮箱格式错误})

 

Django基础