博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
form
阅读量:4638 次
发布时间:2019-06-09

本文共 7102 字,大约阅读时间需要 23 分钟。

form操作动态select数据

forms.py

from django import formsfrom django.forms import fieldsfrom django.forms import widgetsfrom django.forms.models import ModelChoiceFieldfrom app01 import modelsclass UserInfoForm(forms.Form):    user = fields.CharField(        required=True,        widget=widgets.Textarea(attrs={
'class':'c1'}) ) pwd = fields.CharField( max_length=12, widget=widgets.PasswordInput(attrs={
'class':'c1'}) )   #方式一 user_type = fields.ChoiceField( # choices=[(1,'普通用户'),(2,'超级用户')],      choices = [], widget = widgets.Select )   #方式二 user_type2 = fields.CharField(widget=widgets.Select(choices=[]))   #方式三 models.py中需要加上def __str__(self):return self.name   user_type3 = ModelChoiceField( empty_label='请选择用户类型', to_field_name='name',#html的源码里面value=name对应值 queryset=models.UserType.objects.all() ) def __init__(self,*args,**kwargs): super(UserInfoForm, self).__init__(*args,**kwargs) self.fields['user_type'].choices = models.UserType.objects.values_list('id','name')#在执行构造函数的时候去数据库取数据,value_list返回的是列表里面加元祖 self.fields['user_type2'].widget.choices = models.UserType.objects.values_list('id','name')

 

views.py

from django.shortcuts import renderfrom app01.forms import UserInfoFormfrom app01 import models# Create your views here.def index(request):    obj = UserInfoForm()    # obj.fields['user_type'].choices = models.UserType.objects.values_list('id','name')    #类里面的静态字段,必须重新去数据库取值赋值,或者在forms.py中构造函数中取值    return render(request,'index.html',{
'obj':obj})

index.html

    
Title

{

{ obj.user }}

{

{ obj.pwd }}

{

{ obj.user_type }} {
{ obj.user_type2 }}

 form内置钩子

通过obj.is_valid()查看源码

用户注册在提交的时候需要判断用户是否已经注册,用clean_name

验证过程:

  正则+clean_字段->clean(__all__)->_post_clean

forms.py

class RegisterForm(forms.Form):    user = fields.CharField()    email = fields.EmailField()    def clean_name(self):        c = models.User.objects.filter(name=self.cleaned_data['user']).count()        if c:            return self.cleaned_data['user']        else:            raise ValidationError('用户名已经存在',code='xxx')    def clean(self):        return self.cleaned_data#整体错误信息在__all__里

 

序列化

QuerySet

第一种:

  from django.core import serializers

  v = models.tb.objects.all()

  data = serializers.serialize('json',v)

第二种

import jsonfrom django.core.exceptions import ValidationErrorclass JsonCustomEncoder(json.JSONEncoder):    def default(self, field):        if isinstance(field,ValidationError):            return{
'code':field.code,'messages':field.messages} else: return json.JSONEncoder.default(self,field)v= models.tb.objects.values('id','name')v = list(v)v = json.dumps(v,cls=JsonCustomEncoder)

ajax提交 html

    
Title
{% csrf_token %}

提交

views.py

from django.shortcuts import render,HttpResponsefrom app01.forms import LoginFormimport jsonfrom django.core.exceptions import ValidationErrorclass JsonCustomEncoder(json.JSONEncoder):    def default(self, field):        if isinstance(field,ValidationError):            return{
'code':field.code,'messages':field.messages} else: return json.JSONEncoder.default(self,field)def login(request): if request.method == 'GET': return render(request,'login.html') elif request.method == 'POST': ret = {
'status':True,'error':None,'data':None} obj = LoginForm(request.POST) if obj.is_valid(): print(obj.cleaned_data) else: # ret['error'] = obj.errors.as_json()#返回字符串 ret['error'] = obj.errors.as_data()#返回字典 key-validationerror result = json.dumps(ret,cls=JsonCustomEncoder) # return HttpResponse(json.dumps(ret)) return HttpResponse(result)

 

 

ModelForm组件

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
ModelForm
    
a.  
class 
Meta:
            
model,                           
# 对应Model的
            
fields
=
None
,                     
# 字段
            
exclude
=
None
,                    
# 排除字段
            
labels
=
None
,                     
# 提示信息
            
help_texts
=
None
,                 
# 帮助提示信息
            
widgets
=
None
,                    
# 自定义插件
            
error_messages
=
None
,             
# 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
            
field_classes
=
None               
# 自定义字段类 (也可以自定义字段)
            
localized_fields
=
(
'birth_date'
,) 
# 本地化,如:根据不同时区显示数据
            
如:
                
数据库中
                    
2016
-
12
-
27 
04
:
10
:
57
                
setting中的配置
                    
TIME_ZONE 
= 
'Asia/Shanghai'
                    
USE_TZ 
= 
True
                
则显示:
                    
2016
-
12
-
27 
12
:
10
:
57
    
b. 验证执行过程
        
is_valid 
-
> full_clean 
-
> 钩子 
-
> 整体错误
 
    
c. 字典字段验证
        
def 
clean_字段名(
self
):
            
# 可以抛出异常
            
# from django.core.exceptions import ValidationError
            
return 
"新值"
    
d. 用于验证
        
model_form_obj 
= 
XXOOModelForm()
        
model_form_obj.is_valid()
        
model_form_obj.errors.as_json()
        
model_form_obj.clean()
        
model_form_obj.cleaned_data
    
e. 用于创建
        
model_form_obj 
= 
XXOOModelForm(request.POST)
        
#### 页面显示,并提交 #####
        
# 默认保存多对多
            
obj 
= 
form.save(commit
=
True
)
        
# 不做任何操作,内部定义 save_m2m(用于保存多对多)
            
obj 
= 
form.save(commit
=
False
)
            
obj.save()      
# 保存单表信息
            
obj.save_m2m()  
# 保存关联多对多信息
 
    
f. 用于更新和初始化
        
obj 
= 
model.tb.objects.get(
id
=
1
)
        
model_form_obj 
= 
XXOOModelForm(request.POST,instance
=
obj)
        
...
 
        
PS: 单纯初始化
            
model_form_obj 
= 
XXOOModelForm(initial
=
{...})

 

forms.py

from django import formsfrom django.forms import fieldsfrom django.forms import widgets as Fwidgetsfrom app01 import modelsclass UserInfoModelForm(forms.ModelForm):   #自定义   is_rmb = fields.CharField(        widget=Fwidgets.CheckboxInput()    )    class Meta:        model = models.UserInfo        fields = '__all__'        # fields = ['username','pwd']        # exclude = ['username']        labels={            'username':'用户名',            'email':'邮件'        }        widgets = {            'username':Fwidgets.Textarea(attrs={
'class':'c1'}) } error_messages = { 'email':{ 'required':'邮箱不能为空', } }

views.py

from django.shortcuts import renderfrom app01 import formsfrom app01 import models# Create your views here.def index(request):    if request.method == 'GET':        obj = forms.UserInfoModelForm()        return render(request,'index.html',{
'obj':obj}) elif request.method == 'POST': obj = forms.UserInfoModelForm(request.POST) if obj.is_valid(): obj.save() return render(request, 'index.html', {
'obj': obj})def user_list(request): obj = models.UserInfo.objects.all().select_related('type') return render(request,'user_list.html',{
'obj':obj})def edit(request,nid): if request.method=='GET': obj = models.UserInfo.objects.filter(id=nid).first() mf = forms.UserInfoModelForm(instance=obj) return render(request,'user_edit.html',{
'mf':mf,'id':nid}) elif request.method == 'POST': obj = models.UserInfo.objects.filter(id=nid).first() mf = forms.UserInfoModelForm(request.POST,instance=obj) if mf.is_valid(): mf.save() else: print(mf.errors.as_json()) return render(request, 'user_edit.html', {
'mf': mf, 'id': nid})

 

转载于:https://www.cnblogs.com/hongpeng0209/p/6713721.html

你可能感兴趣的文章
javascript学习笔记
查看>>
hdu 3996
查看>>
python第三十九课——面向对象(二)之初始化属性
查看>>
python学习笔记之函数装饰器
查看>>
FEM计算2D瞬态热传导方程
查看>>
四年时光,匆匆而过
查看>>
【php】【psr】psr1 基础编码规范
查看>>
WAF SSI
查看>>
LDAP & it's implementation
查看>>
Apache HttpComponents中的cookie匹配策略
查看>>
冰封的海盗攻略
查看>>
python from entry to abandon
查看>>
Netty4.x中文教程系列(四) 对象传输
查看>>
linux下find命令使用举例、
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
ubuntun 服务器与Mac
查看>>
重温JSP学习笔记--与日期数字格式化有关的jstl标签库
查看>>
java-Date-DateFormat-Calendar
查看>>
封装CLLocationManager定位获取经纬度
查看>>
我的第一篇博客-(Eclipse中或Myeclipse中如果不小心删除了包那可怎么办?)
查看>>