Django  Form

Django的Form主要具有一下几大功能:

  • 生成HTML标签
  • 验证用户数据(显示错误信息)
  • HTML Form提交保留上次提交数据
  • 初始化页面显示内容(自定义样式)

一、Form 简单示例:

1、view中创建Form类并进行函数处理

from django import forms  # 导入forms
class FM(forms.Form):
user = forms.CharField()
pwd = forms.CharField()
email = forms.EmailField() def fm(request):
if request.method == "GET":
obj = FM()
return render(request, 'fm.html', {'obj': obj})
elif request.method == "POST":
# 获取用户所有数据
# 每条数据请求的验证
# 成功:获取所有的正确的信息
# 失败:显示错误信息
obj = FM(request.POST) # 生成from表单验证对象实例
r1 = obj.is_valid() # 获取obj对象是否有效
if r1:
# obj.cleaned_data
print(r1)
print(obj.changed_data) else:
print(r1)
print(obj.errors.as_json())
# 错误信息字典形式
# {"user": [{"message": "This field is required.", "code": "required"}],
# "pwd": [{"message": "This field is required.", "code": "required"}],
# "email": [{"message": "This field is required.", "code": "required"}]}
print(obj.errors['user'][0])
return redirect("/fm/")

2、生成HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/fm/" method="POST">
{% csrf_token %}
{# <!--第一种 input框形式-->#}
{# <p><input type="text" name="user"/> {{ obj.errors.user.0 }}</p> <!--user pwd email 必须要跟视图中的继承forms.Form类中的相应实例名称一致-->#}
{# <p><input type="text" name="pwd"/> {{ obj.errors.pwd.0 }}</p>#}
{# <p><input type="text" name="email"/> {{ obj.errors.email.0 }}</p>#}
<!--第二种 obj.user框形式-->
<p>{{ obj.user }} {{ obj.errors.user.0 }}</p> <!-- 类似于view视图中的 obj.errors['user'][0]-->
<p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.email.0 }}</p> {# <!--第三种 obj.as_p、obj.as_ul、 obj.as_table(需要在外面添加table标签)框形式,生成方便,自定义样式不强-->#}
{# {{ obj.as_p }}#}
{# {{ obj.as_ul }}#}
{# <table>#}
{# {{ obj.as_table }}#}
{# </table>#}
<input type="submit" value="提交" />
</form>
</body>
</html>

二、Form类

创建Form类时,主要涉及到 fields【字段】 和 wiegets【插件】,功能特性:字段用于对用户请求数据的验证,插件用于自动生成HTML(保留上一次提交的数据)。使用场景:1、在新url方式操作时,字段和插件都需要用到,因为在from提交之后,页面也会被刷新,而插件可以保留上一次的提交数据。2、在用Ajax请求操作时,可以只用到字段的验证功能,因为Ajax请求页面不会刷新,上一次提交数据仍然保留在页面,当然在用Ajax请求操作时也可以使用插件。

1、Django内置字段如下:

 Field
required=True, 是否允许为空
widget=None, HTML插件
label=None, 用于生成Label标签或显示内容
initial=None, 初始值
help_text='', 帮助信息(在标签旁边显示)
error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
validators=[], 自定义验证规则
localize=False, 是否支持本地化
disabled=False, 是否可以编辑
label_suffix=None Label内容后缀 CharField(Field)
max_length=None, 最大长度
min_length=None, 最小长度
strip=True 是否移除用户输入空白 IntegerField(Field)
max_value=None, 最大值
min_value=None, 最小值 FloatField(IntegerField)
... DecimalField(IntegerField)
max_value=None, 最大值
min_value=None, 最小值
max_digits=None, 总长度
decimal_places=None, 小数位长度 BaseTemporalField(Field)
input_formats=None 时间格式化 DateField(BaseTemporalField) 格式:2015-09-01
TimeField(BaseTemporalField) 格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 DurationField(Field) 时间间隔:%d %H:%M:%S.%f
... RegexField(CharField)
regex, 自定制正则表达式
max_length=None, 最大长度
min_length=None, 最小长度
error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'} EmailField(CharField)
... FileField(Field)
allow_empty_file=False 是否允许空文件 ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype="multipart/form-data"
- view函数中 obj = MyForm(request.POST, request.FILES) URLField(Field)
... BooleanField(Field)
... NullBooleanField(BooleanField)
... ChoiceField(Field)
...
choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),)
required=True, 是否必填
widget=None, 插件,默认select插件
label=None, Label内容
initial=None, 初始值
help_text='', 帮助提示 ModelChoiceField(ChoiceField)
... django.forms.models.ModelChoiceField
queryset, # 查询数据库中的数据
empty_label="---------", # 默认空显示内容
to_field_name=None, # HTML中value的值对应的字段
limit_choices_to=None # ModelForm中对queryset二次筛选 ModelMultipleChoiceField(ModelChoiceField)
... django.forms.models.ModelMultipleChoiceField TypedChoiceField(ChoiceField)
coerce = lambda val: val 对选中的值进行一次转换
empty_value= '' 空值的默认值 MultipleChoiceField(ChoiceField)
... TypedMultipleChoiceField(MultipleChoiceField)
coerce = lambda val: val 对选中的每一个值进行一次转换
empty_value= '' 空值的默认值 ComboField(Field)
fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) MultiValueField(Field)
PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用 SplitDateTimeField(MultiValueField)
input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
required=True,
widget=None,
label=None,
initial=None,
help_text='' GenericIPAddressField
protocol='both', both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用 SlugField(CharField) 数字,字母,下划线,减号(连字符)
... UUIDField(CharField) uuid类型 UUID是根据MAC以及当前时间等创建的不重复的随机字符串
...

fields-字段

2、Django内置插件:

 TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget

wiegets-插件

2.1、常用的内置插件演示:

 # 单radio,值为字符串
# user = fields.CharField(
# initial=2,
# widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
# ) # 单radio,值为字符串
# user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# initial=2,
# widget=widgets.RadioSelect
# ) # 单select,值为字符串
# user = fields.CharField(
# initial=2,
# widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
# ) # 单select,值为字符串
# user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# initial=2,
# widget=widgets.Select
# ) # 多选select,值为列表
# user = fields.MultipleChoiceField(
# choices=((1,'上海'),(2,'北京'),),
# initial=[1,],
# widget=widgets.SelectMultiple
# ) # 单checkbox
# user = fields.CharField(
# widget=widgets.CheckboxInput()
# ) # 多选checkbox,值为列表
# user = fields.MultipleChoiceField(
# initial=[2, ],
# choices=((1, '上海'), (2, '北京'),),
# widget=widgets.CheckboxSelectMultiple
# )

常用内置插件演示

2.2、Form操作动态Select数据:

 # forms.py  在app目录下创建forms.py文件,来专门存放form验证的代码
from django.forms import widgets,forms,fields
from app01 import models class UserForm(forms.Form): name = fields.CharField(
required=False,
widget=widgets.TextInput(attrs={'class':'c1'})
) email = fields.EmailField(
max_length=12,
widget=widgets.TextInput(attrs={"class":"c2"})
) user_type = fields.ChoiceField
### 第一种form动态获取select数据
#静态变量,仅在程序第一次加载时执行,从数据库读取数据保存至内存,重启服务才能从数据库获取最新数据
# choices=models.UserType.objects.values_list('id','type_name'), ### 第二种form动态获取select数据,自定义构造方法,
choices=[],
widget=widgets.Select
) user_type2 = fields.CharField(widget=widgets.Select(choices=[])) #fields['user_type2'].widget.choices def __init__(self,*args,**kwargs):
super(UserForm,self).__init__(*args,**kwargs) # 构造方法中实例变量会在每次实例化后执行
self.fields["user_type"].choices = models.UserType.objects.values_list('id','type_name')
self.fields['user_type2'].widget.choices = models.UserType.objects.values_list('id','type_name') # view.py 在view.py视图函数中去调用From验证 from django.shortcuts import render
from app01 import models def index(request):
from app01.forms import UserForm
### 第一种form动态获取select数据
#obj = UserForm() # 实例化UserForm类
# obj.fields["user_type"].choices=models.UserType.objects.values_list('id','type_name') #每次刷新web页面就相当于实例化一次UserForm类,从而从数据库获取最新数据 ### 第二种form动态获取select数据,自定义构造方法
obj = UserForm() #实例化UserForm类,这里只需要实例化,而form UserForm类中重写的构造方法中的实例变量会在每次实例化之后执行一次
return render(request,'index.html',{'obj':obj}) #HTML
<body>
<p>{{ obj.name }}</p>
<p>{{ obj.email }}</p>
<p>{{ obj.user_type }}</p>
<p>{{ obj.user_type2 }}</p>
</body>

方式一,自定义构造方法

 ##form.py
#ModelChoiceField具体字段如下:
ModelChoiceField(ChoiceField)
... django.forms.models.ModelChoiceField
queryset, # 查询数据库中的数据
empty_label="---------", # 默认空显示内容
to_field_name=None, # HTML中value的值对应的字段
limit_choices_to=None # ModelForm中对queryset二次筛选 ### from django.forms import widgets,forms,fields
from django.forms.models import ModelChoiceField #django自己帮我们提供的 class UserForm(forms.Form):
user_type3 = ModelChoiceField(
queryset=models.UserType.objects.all(),
to_field_name="id", #html中的value的值的对应字段,一般情况下只用id
empty_label="请选择用户类型", #默认空显示内容
) ##ModelChoiceField必须跟model中的__str__函数想结合使用:
class UserType(models.Model):
type_name = models.CharField(max_length=32) def __str__(self): #必须跟__str__这个函数结合使用
return self.type_name #view.py def index(request): from app01.forms import UserForm
obj = UserForm() return render(request,'index.html',{'obj':obj}) #HTML
<body>
<p>{{ obj.user_type3 }}</p>
</body>

方式二、ModelChoiceField

3、Form内置钩子进行验证:

django form中还预留了钩子,主要有三个类型的钩子:_clean_fields (单个字段验证,,如:登录页面user or password字段)、_clean_fields (整体验证,如:登录页面整体)、_post_clean(预留的钩子,主要坐收尾工作)

3.1、_clean_fields

 from app01 import models
from django.core.exceptions import ValidationError #源码里面抛出的异常
class RegisterForm(forms.Form):
user = fields.CharField() #下面的方法要想执行,先通过这边正则验证
email = fields.EmailField()
#根据源码,我们知道在我们自己自定义的form中,是 定义clean_字段名 方法,去验证,然后赋值给 cleaned_data
#clean_%s 这个函数必须要有返回值,赋值给self.cleaned_data['%s']
def clean_user(self):
#注册的时候,如果存在此用户,则报错,没有,则继续执行
c = models.User.objects.filter(name=self.cleaned_data['user'].count())
if not c:
return self.cleaned_data['user']
else:
raise ValidationError('用户名已经存在',code="xxxx") #存在就包异常 def clean_email(self): return self.cleaned_data['email'] #这边必须返回一个值

clean_fields 单个字段验证

3.2、_clean_form

 from app01 import models
from django.core.exceptions import ValidationError #源码里面抛出的异常
class RegisterForm(forms.Form):
user = fields.CharField() #下面的方法要想执行,先通过这边正则验证
pwd = fields.CharField() def clean(self):
c = models.User.objects.filter(name=self.cleaned_data['user'],pwd=self.cleaned_data['pwd']).count()
if not c:
return self.cleaned_data #这边必须有一个返回值,因为源码里面有返回值
else:
raise ValidationError("用户名或密码错误",code="xxxxx") #这个异常应该给整体,不应该给某一个字段

clean_form from整体验证

3.3、单个字段错误提示和form整体错误提示

 obj.errors:
{
#self._clean_form() 返回的错误信息,也就是整体返回的错误信息,有的地方写成: NON_FIFLD_ERRORS:[],其实就是代指的__all__
'__all__':[],
# clean_user和clean_pwd返回的错误信息,就是单个验证返回的错误信息
'user':[{'code':"required",'message':'xxxx'}],
'pwd':[{'code':"required",'message':'xxxx'}]
}

错误提示定义

4、自定义验证规则:

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator class MyForm(Form):
user = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
)

方式一

import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError # 自定义验证规则
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误') class PublishForm(Form): title = fields.CharField(max_length=20,
min_length=5,
error_messages={'required': '标题不能为空',
'min_length': '标题最少为5个字符',
'max_length': '标题最多为20个字符'},
widget=widgets.TextInput(attrs={'class': "form-control",
'placeholder': '标题5-20个字符'})) # 使用自定义验证规则
phone = fields.CharField(validators=[mobile_validate, ],
error_messages={'required': '手机不能为空'},
widget=widgets.TextInput(attrs={'class': "form-control",
'placeholder': u'手机号码'})) email = fields.EmailField(required=False,
error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

方式二

# 自定义方法
from django import forms
from django.forms import fields
from django.forms import widgets
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator class FInfo(forms.Form):
username = fields.CharField(max_length=5,
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
email = fields.EmailField() def clean_username(self):
"""
Form中字段中定义的格式匹配完之后,执行此方法进行验证
:return:
"""
value = self.cleaned_data['username']
if "" in value:
raise ValidationError('666已经被玩烂了...', 'invalid')
return value

方式三

#同时生成多个标签进行验证
from django.forms import Form
from django.forms import widgets
from django.forms import fields from django.core.validators import RegexValidator ############## 自定义字段 ##############
class PhoneField(fields.MultiValueField):
def __init__(self, *args, **kwargs):
# Define one message for all fields.
error_messages = {
'incomplete': 'Enter a country calling code and a phone number.',
}
# Or define a different message for each field.
f = (
fields.CharField(
error_messages={'incomplete': 'Enter a country calling code.'},
validators=[
RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
],
),
fields.CharField(
error_messages={'incomplete': 'Enter a phone number.'},
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
),
fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
required=False,
),
)
super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
**kwargs) def compress(self, data_list):
"""
当用户验证都通过后,该值返回给用户
:param data_list:
:return:
"""
return data_list ############## 自定义插件 ##############
class SplitPhoneWidget(widgets.MultiWidget):
def __init__(self):
ws = (
widgets.TextInput(),
widgets.TextInput(),
widgets.TextInput(),
)
super(SplitPhoneWidget, self).__init__(ws) def decompress(self, value):
"""
处理初始值,当初始值initial不是列表时,调用该方法
:param value:
:return:
"""
if value:
return value.split(',')
return [None, None, None]

方式四

5、Form内置序列化错误信息:

 #form.py
rom django import forms
from django.forms import fields,widgets class LoginForm(forms.Form):
username = fields.CharField() #这跟login.html中的input标签的name属性的值一致
password = fields.CharField(
max_length=64,
min_length=12
) #view 中的login 函数
#第一种 使用ErrorDict中的as_json函数,不过在HTML中相应获取错误信息需要反解两次
from django.shortcuts import render,HttpResponse
import json
def login(request):
ret = {'status':True,'error':None,'data':None}
if request.method == "GET":
return render(request,'login.html')
elif request.method == "POST":
obj = LoginForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
else:
# print(type(obj.errors)) 通过打印类型得知是属于ErrorDict
from django.forms.utils import ErrorDict #通过源码得知:as_data 返回的是原生的字典,as_json()是类似json格式的字符串
ret['error'] = obj.errors.as_json()
return HttpResponse(json.dumps(ret)) #因为as_json()和json.dumps 相当于序列化了两次 #第二张自定义JsonCustomEncoder类
from django.core.exceptions import ValidationError
import json
class JsonCustomEncoder(json.JSONEncoder): #直接在cls=JsonCustomEncoder类名,去序列化复杂的数据类型
def default(self,field):
if isinstance(field,ValidationError): #
# # from django.core.exceptions import ValidationError #看一下这个异常,发现field的字段和错误信息都保存在这个ValidationError对象里
return {'code':field.code,'messages':field.messages}
else:
return json.JSONEncoder.default(self,field) from django.shortcuts import render,HttpResponse
import json def login(request):
ret = {'status':True,'error':None,'data':None}
if request.method == "GET":
return render(request,'login.html')
elif request.method == "POST":
obj = LoginForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
else:
ret['error'] = obj.errors.as_data()
# for k,v in obj.errors.as_data().items():
# print(k,v) 通过打印发现as_data后 value是一个ValidationError对象
# ret = {'k1':'v1','k2':ValueError()} #像这种复杂数据类型,json是不能序列化的,我们只能做局部处理
#这边cls 是序列化的时候,对每一个字段序列化的时候,都会调用一个它的default方法,因此重写JsonCustomEncoder类中default方法来进行复杂情况下的序列化操作
result = json.dumps(ret,cls=JsonCustomEncoder)
return HttpResponse(result) #HTML
"""
<body>
<form id="fm">
{% csrf_token %}
<p><input type="text" name="username" /></p> #这边username 需要跟 from 里面的字段 是一模一样
<p><input type="text" name="password" /></p>
<a id="submit">提交</a>
</form> <script src="/static/jquery-1.12.4.js"></script>
<script>
$(function(){
$('#submit').click(function(){
$.ajax({
url:'/login/',
type:'post',
data:$('#fm').serialize(),
sucess:function(arg){
//console.log(arg);
arg = JSON.parse(arg);
console.log(arg)
},
error:function(){ }
})
})
})
</script>
</body>""" #返回的数据类型为: "{\"data\": null, \"status\": true, \"error\": {\"username\": [{\"code\": \"required\", \"messages\": [\"This field is required.\"]}],
\"password\": [{\"code\": \"required\", \"messages\": [\"This field is required.\"]}]}}"

序列化错误信息的两种方式

6、Form类中的fields、widgets 简单示例:

a、Form类:

from django import forms  # 导入forms
from django.forms import widgets # 导入插件
from django.forms import fields # 导入字段,以后对于像charField、EmailField等字段格式的处理不需要在通过form.进行定义了,而是通过fields进行定义 class FM(forms.Form):
# 字段本身只做验证
user = fields.CharField(
error_messages={'required': '用户名不能为空.'}, # 定义错误信息的提示语,required为定义输入框为空的提示语
# widget=widgets.Textarea(attrs={'class': 'c1'}), # 导入插件中的多行文本输入,并定义样式
label="用户名", # 定义标签名称
)
pwd = fields.CharField(
max_length=12, # 定义字符最大、最近小字符长度,及相应错误提示语
min_length=6,
error_messages={'required': '密码不能为空.', 'min_length': '密码长度不能小于6', "max_length": '密码长度不能大于12'},
widget=widgets.PasswordInput(attrs={'class': 'c2'}) # 导入插件中的密码非明文输入,并定义样式
)
email = fields.EmailField(error_messages={'required': '邮箱不能为空.', 'invalid': "邮箱格式错误"}) # invalid定义输入框无效是的提示语 f = fields.FileField() # 文件上传 p = fields.FilePathField(path='app01') # 将路径下的全部文件进行展示 city1 = fields.ChoiceField( # 单项选择框
choices=[(0, '上海'), (1, '广州'), (2, '东莞')]
)
city2 = fields.MultipleChoiceField( # 多项选择框
choices=[(0, '上海'), (1, '广州'), (2, '东莞')]
)

b.views:

from app01 import models

def fm(request):
if request.method == "GET":
# 从数据库中吧数据获取到
dic = {
"user": 'r1',
'pwd': 'password',
'email': 'email@163.com',
'city1': 1,
'city2': [1, 2]
}
obj = FM(initial=dic) # 初始化操作,通过字典形式传递默认值
return render(request, 'fm.html', {'obj': obj})
elif request.method == "POST":
obj = FM(request.POST)
r1 = obj.is_valid()
if r1:
# obj.cleaned_data
print(obj.changed_data)
# models.UserInf.objects.create(**obj.cleaned_data)
else:
# errors 继承了ErrorDict类
print(obj.errors.as_json())
# print(obj.errors['user'][0])
return render(request, 'fm.html', {'obj': obj})
return redirect('http://www.ww.qq.com')

c、HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/fm/" method="POST">
{% csrf_token %}
<p>{{ obj.user.label}}{{ obj.user }} {{ obj.errors.user.0 }}</p> <!-- 类似于view视图中的 obj.errors['user'][0]-->
<p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
<p>{{ obj.f}}</p>
<p>{{ obj.p}}</p>
<p>{{ obj.city1}}</p>
<p>{{ obj.city2}}</p>
<input type="submit" value="提交" />
</form>
</body>
</html>

【python】-- Django Form的更多相关文章

  1. 【python】-- Django

    Django Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sessio ...

  2. 【python】-- Django ORM(基础)

    Django ORM(基础) Django 框架十分强大,自带数据库操作功能.Django 跟 SQLAchemy 一样,也是通过ORM(Object Relational Mapping,关系对象映 ...

  3. 【Python】django安装

    官方下载:https://www.djangoproject.com/download/ 报错 [root@test Django-]# python setup.py install Traceba ...

  4. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  5. 【python】-- Django ORM(进阶)

    Django ORM(进阶) 上一篇博文简述了Django ORM的单表操作,在本篇博文中主要简述Django ORM的连表操作. 一.一对多:models.ForeignKey() 应用场景:当一张 ...

  6. 【Python】django表单与提交

    参考:http://djangobook.py3k.cn/2.0/chapter07/ 本文的内容应属于django的表单模块,没有涉及到的后端request对象的处理方法可以单独深入学习表单. UR ...

  7. 【Python】django权限管理

    参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...

  8. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  9. 【Python】Django

    数据表更改 Django 1.7.x 和后来的版本: Django 1.7.x 及以后的版本集成了 South 的功能,在修改models.py了后运行: python manage.py makem ...

随机推荐

  1. POJ 3278: Catch That Cow

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 44613   Accepted: 13946 ...

  2. Linux禁止非WHEEL用户使用SU命令

    通常情况下,一般用户通过运行"su -"命令.输入正确的rootpassword.能够登录为root用户来对系统进行管理员级别的配置. 可是.为了更进一步加强系统的安全性,有必要建 ...

  3. redis主从持久化讨论

    Redis有两种持久化方式,AOF和RDB,AOF持久化是指追加写命令到aof文件的方式,RDB是指定期保存内存快照到rdb文件的方式. RDB虽然可以通过bgsave指令后台保存快照,但fork() ...

  4. Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾

    Atitit.播放系统规划新版本 v4  q18  and 最近版本回顾 1 版本12 (ing)4 1.1 无映射nas系统..4 1.2 图片简介搜刮其4 1.3 12.8. 电影图片增加png, ...

  5. C++语言基础(4)-构造函数和析构函数

    一.构造函数 类似于java,C++中也有构造函数的概念,相关用法如下: 1.1 构造函数的定义 #include <iostream> using namespace std; clas ...

  6. C++程序设计(第4版)读书笔记_指针、数组与引用

    void * 函数指针和指向类成员的指针不能被赋给void * 字符串字面值常量 #include <iostream> using namespace std; void f() { c ...

  7. 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

    [视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...

  8. python语言 buffer类型数据的使用 'ascii' codec can't decode byte 0xe5 问题的解决

    在python中我们使用buffer类型时可以将其转换为str类型. 如果obejct的类型为<type 'buffer'> ,可以使用str(object)将其转换为字符串类型. 在转换 ...

  9. Office Web Apps Server 2013与PDF(一)

    好吧--这个消息有点旧,迟了将近4个月. Office Web Apps是微软各大服务产品系列中的一个基础服务,可以为SharePoint 2013.Exchange 2013.Lync 2013提供 ...

  10. Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...