Django自定義Form表單(驗證、定制錯誤信息、下拉框選擇數據庫中數據)


Django form 表單創建流程
1、創建類,繼承forms.Form
2、頁面根據類的對象自動創建html標簽
3、提交到view.py處理 request.POST
      封裝到類的對象里,obj=myform(request.POST)
4、用戶輸入是否合法
    obj.is_valid()
5、全部合法,獲取全部內容
    all_data=obj.clean()
6、如有有不合法
    error=obj.errors
 
簡單示例:
model創建兩張表,一對多關系:
class Groupname(models.Model):
    caption = models.CharField(max_length=30)  #不同的職務字段
    def __unicode__(self):
        return self.caption

class User(models.Model):
    username = models.CharField(max_length=30)
    password = models.CharField(max_length=30)
    email = models.EmailField()
    city = models.CharField(null=True,max_length=20)
    img_url = models.ImageField(null=True,blank=True,upload_to="upload")   
     #上傳的文件保存到MEDIA_root +upload_to后的路徑
    groupname = models.ForeignKey(Groupname)     
    #User表會自動添加 groupname_id 的一個字段,不會顯示groupname
    def __unicode__(self):
        return self.username

 新增一個myforms.py文件:

import re
from django import forms
from polls import models
from django.core.exceptions import ValidationError

def email_validate(value):  #定義一個郵箱格式匹配函數
    email_re = re.compile(r'^.*?@qq\.com$')  #非貪婪匹配
    if not email_re.match(value):
        raise ValidationError('郵箱格式錯誤')

class GroupForm(forms.Form):  #定義組表單
    Form_caption = forms.CharField(max_length=30,label=u"職務")  # 不同的職位字段

class UserForm(forms.Form):  #定義用戶注冊的表單
    city_list = (
         (1, '深圳'),
         (2, '成都'),
         (3, '北京'),
     )
    Form_username = forms.CharField(max_length=30,error_messages={'required':u'用戶名不能為空'})
    Form_password = forms.CharField(widget=forms.PasswordInput())
    Form_email = forms.EmailField(validators=[email_validate,],    #使用定義的錯誤規則函數
                                  error_messages={'required': u'郵箱不能為空'},
                                  widget=forms.TextInput(attrs={'class': "form-control",'placeholder':u'您的郵箱'})
                                  )
    Form_city = forms.IntegerField(widget=forms.Select(choices=city_list))  
    #從定義好的list中獲取,用戶選擇后,將id傳到后台處理
    Form_img = forms.ImageField(required=False)     #備注允許為空
    Form_groupname_id = forms.IntegerField(widget=forms.Select())  
    #創建groupform字段為下拉選擇框,注意是數字類型,將id傳到后台處理
    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)
        self.fields['Form_groupname_id'].widget.choices = models.Groupname.objects.all().values_list('id', 'caption')
        #指定該字段的數據源是從Groupname表中獲取id、caption

 view中使用自定義的form表單:

from models import Groupname,User
from myforms import GroupForm,UserForm

def create_groupname(request):
    if request.method == 'POST':
        form = GroupForm(request.POST)
        if form.is_valid():
            all_data = form.clean()
            Groupname.objects.create(caption = all_data['caption'])
            return HttpResponse("添加成功")
    else:
        form = GroupForm()
    return render(request,'polls/group_add.html',{'form':form})

def create_user(request):
    if request.method == 'POST':
        form = UserForm(request.POST,request.FILES)  #調用自定義表單
        city_list = (
            (1, '深圳'),
            (2, '成都'),
            (3, '北京'),
        )
        if form.is_valid():
            all_data = form.clean()   #獲取post數據,例如 {'username': u'yang1', 'usergroup': 1}
            User.objects.create(
                username = all_data['Form_username'],
                password = all_data['Form_password'],
                email = all_data['Form_email'],
                city = city_list[all_data['Form_city']-1][1],
                img_url = form.cleaned_data['Form_img'],
                groupname_id = all_data['Form_groupname_id']
                )
            return HttpResponse("注冊成功")
        else:
            error = form.errors
            form = UserForm()
            return render(request, 'polls/user_add.html', {'form':form,'error': error})
    else:
        form = UserForm()
    return render(request,'polls/user_add.html',{'form':form})

 user_add.html主要代碼如下:

<body>
    <form action="/polls/user" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p>用戶名:{{ form.Form_username }}</p>
        <p>密碼:{{ form.Form_password }}</p>
        <p>郵箱:{{ form.Form_email }}<span>{{ error.Form_email }}</span></p>
        <p>居住城市:{{ form.Form_city }}</p>
        <p>頭像:{{ form.Form_img }}</p>
        <p>職務:{{ form.Form_groupname_id }}</p>
        <input type="submit" value="注冊" />
</form>
</body>

 group_add.html主要代碼:

    <form action="/polls/groupname" method="post">
        {% csrf_token %}
        <p>職務:{{ form.Form_caption }}</p>
        <input type="submit" value="添加" />
    </form>

效果如下:

http://127.0.0.1:8000/polls/user

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM