form

form操作动态select数据

forms.py

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.py

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.html

<!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()查看源码

用户注册在提交的时候需要判断用户是否已经注册,用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 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})
原文地址:https://www.cnblogs.com/hongpeng0209/p/6713721.html