form

form操做动态select数据html

forms.pypython

from django import forms
from django.forms import fields
from django.forms import widgets
from django.forms.models import ModelChoiceField
from app01 import models
class 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.pyjquery

from django.shortcuts import render
from app01.forms import UserInfoForm
from 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.htmlajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>
        {{ obj.user }}
    </p>
    <p>
        {{ obj.pwd }}
    </p>
    <p>
        {{ obj.user_type }}
        {{ obj.user_type2 }}
    </p>
</body>
</html>

 form内置钩子数据库

经过obj.is_valid()查看源码django

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

验证过程:app

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

forms.pypost

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 json
from django.core.exceptions import ValidationError

class 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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form id="info">{% csrf_token %}
        <p><input type="text" name="username"/></p>
        <p><input type="password"name="pwd"/></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:$('#info').serialize(),#获取form表单中的全部
                    success:function (arg) {
                        console.log(arg);
                        arg = JSON.parse(arg);
                        console.log(arg);

                    },
                    error:function () {
                        
                    }
                })
            })

        })
    </script>
</body>
</html>

views.py

from django.shortcuts import render,HttpResponse
from app01.forms import LoginForm
import json
from django.core.exceptions import ValidationError

class 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 forms
from django.forms import fields
from django.forms import widgets as Fwidgets
from app01 import models


class 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 render
from app01 import forms
from 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})
相关文章
相关标签/搜索