码迷,mamicode.com
首页 > 其他好文 > 详细

ModelForm的简单使用-注册用modelform编写

时间:2019-05-02 21:33:52      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:usermod   query   rect   add   mail   ice   poll   search   choices   

1.前端的ajax代码不用改动

2.modelform,在原来基础上稍作改动

技术图片
from django import forms
from app01.models import UserInfo
from django.forms import widgets as wid
from django.core.exceptions import ValidationError
import re

class UserModelForm(forms.ModelForm):
    r_password = forms.CharField(min_length=5, label="确认密码", widget=wid.PasswordInput(),
                                 error_messages={
                                     "required": "确认密码不能为空!",
                                     "min_length": "确认密码不能少于5位!"
                                 }
                                 )
    class Meta:
        model=UserInfo
        fields=["username","password","r_password","email"]
        labels={
            "username":"用户名",
            "password":"密码",
            "email":"邮箱"
        }
        error_messages={
            "username":{"required":"用户名不能为空!",
                        "min_length":"用户名不能少于5位!"},
            "password":{"required":"密码不能为空!",
                        "min_length": "密码不能少于5位!"},
            "email":{"required":"邮箱不能为空!",
                     "invalid":"邮箱格式错误!"}
        }
        widgets={"password":wid.PasswordInput()}

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for field in self.fields.values():
            field.widget.attrs.update({"class":"form-control"})

    def clean_username(self):
        val = self.cleaned_data.get("username")
        user_obj = UserInfo.objects.filter(username=val).first()
        if user_obj:
            raise ValidationError("该用户已经存在!")
        else:
            return val

    def clean_password(self):
        val = self.cleaned_data.get("password")
        if val.isdigit():
            raise ValidationError("密码不能是纯数字!")
        else:
            return val

    def clean_email(self):
        val = self.cleaned_data.get("email")
        ret = re.search("\w+@163.com$",val)
        if ret:
            return val
        else:
            raise ValidationError("邮箱必须是163邮箱!")

    def clean(self):
        password = self.cleaned_data.get("password")
        r_password = self.cleaned_data.get("r_password")
        if password and r_password and password != r_password:
            self.add_error("r_password",ValidationError("两次密码输入不一致!"))
        else:
            return self.cleaned_data
技术图片

3.视图函数,稍微一改

技术图片
def reg(request):
    # 注册功能
    if request.method == "POST":
        ret = json.loads(request.body)
        form = UserModelForm(ret)
        res = {"status":200,"err_msg":""}
        if form.is_valid():
            form.save()
            # del ret["r_password"]
            # UserInfo.objects.create_user(**ret)
        else:
            res["status"] = 201
            res["err_msg"] = form.errors
        return JsonResponse(res)
    else:
        form = UserModelForm()
        return render(request,"reg.html",{"form":form})
技术图片

modelform的使用

(1) model的知识点:
class UserInfo(AbstractUser):
tel=models.CharField(max_length=32)
gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1)

yuan=UserInfo.objects.get(pk=1)
yuan.get_gender_display()

(2) modelform使用
model.py:
class Book(models.Model):
nid=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
pub_date=models.DateTimeField() # "2012-12-12"

# comment_count=models.IntegerField(default=100)
# poll_count=models.IntegerField(default=100)

publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE) # 级联删除
authors=models.ManyToManyField(to="Author")
def __str__(self):
return self.title
form.py:
# 构建modelform
class BookModelForm(forms.ModelForm):
class Meta:
model=Book
fields="__all__"

‘‘‘
BookModelForm等同于:
class BookForm(forms.Form):
title=forms.CharField(max_length=32)
price=forms.IntegerField()
pub_date=forms.DateField(widget=widgets.TextInput(attrs={"type":"date"}))
#publish=forms.ChoiceField(choices=[(1,"AAA"),(2,"BBB")])
publish=forms.ModelChoiceField(queryset=Publish.objects.all())
authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())

‘‘‘

逻辑:
添加书籍:
def add(reqeust):
if GET请求:
form=BookModelForm()
return render(reqeust,{"form":form})
‘‘‘
渲染页面
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" value="提交" class="btn btn-default pull-right">
</form>
‘‘‘
else POST请求:
form=BookModelForm(request.POST)
if form.is_valid():
form.save() # Book.objects.create(clean_data)
return redirect("/")
else:
return render(reqeust,{"form":form})



编辑书籍:

def edit(request,id):
edit_obj=Book.objects.get(pk=id)
if GET请求:
form=BookModelForm(instance=edit_obj)
return render(reqeust,{"form":form})
‘‘‘
渲染页面同添加页面

‘‘‘
else POST请求:
form=BookModelForm(request.POST,instance=edit_obj)
if form.is_valid():
form.save() # edit_obj.update(clean_data)
return redirect("/")
else:
return render(reqeust,{"form":form})


技术图片
(1)  model的知识点:
             class UserInfo(AbstractUser):
                    tel=models.CharField(max_length=32)
                    gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1)
             
             yuan=UserInfo.objects.get(pk=1)
             yuan.get_gender_display()

    (2) modelform使用
        model.py:
            class Book(models.Model):
                nid=models.AutoField(primary_key=True)
                title=models.CharField(max_length=32)
                price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
                pub_date=models.DateTimeField()  # "2012-12-12"

                # comment_count=models.IntegerField(default=100)
                # poll_count=models.IntegerField(default=100)

                publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE)  # 级联删除
                authors=models.ManyToManyField(to="Author")
                def __str__(self):
                    return self.title
        form.py:
               # 构建modelform
               class BookModelForm(forms.ModelForm):
                    class Meta:
                        model=Book
                        fields="__all__"
                        
               ‘‘‘
               BookModelForm等同于:
                    class BookForm(forms.Form):
                            title=forms.CharField(max_length=32)
                            price=forms.IntegerField()
                            pub_date=forms.DateField(widget=widgets.TextInput(attrs={"type":"date"}))
                            #publish=forms.ChoiceField(choices=[(1,"AAA"),(2,"BBB")])
                            publish=forms.ModelChoiceField(queryset=Publish.objects.all())
                            authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())
      
               ‘‘‘
                

        逻辑:
            添加书籍:
                def add(reqeust):
                     if GET请求:
                          form=BookModelForm()
                          return render(reqeust,{"form":form})
                          ‘‘‘
                          渲染页面
                              <form action="" method="post" novalidate>
                                    {% csrf_token %}
                                      {% for field in form %}
                                            <div class="form-group">
                                                 <label for="title">{{ field.label }}</label>
                                                 {{ field }}
                                                 <span>{{ field.errors.0 }}</span>
                                            </div>
                                     {% endfor %}
                                    <input type="submit" value="提交" class="btn btn-default pull-right">
                              </form>
                          ‘‘‘
                    else POST请求:
                          form=BookModelForm(request.POST)
                          if form.is_valid():
                              form.save() # Book.objects.create(clean_data)
                              return redirect("/")
                          else:
                             return render(reqeust,{"form":form})
                               
                                
                
            编辑书籍: 
                           
                def edit(request,id):
                        edit_obj=Book.objects.get(pk=id)
                        if GET请求:
                          form=BookModelForm(instance=edit_obj)
                          return render(reqeust,{"form":form})
                          ‘‘‘
                          渲染页面同添加页面
                              
                          ‘‘‘
                    else POST请求:
                          form=BookModelForm(request.POST,instance=edit_obj)
                          if form.is_valid():
                              form.save() #  edit_obj.update(clean_data)
                              return redirect("/")
                          else:
                             return render(reqeust,{"form":form})
技术图片

 

ModelForm的简单使用-注册用modelform编写

标签:usermod   query   rect   add   mail   ice   poll   search   choices   

原文地址:https://www.cnblogs.com/pcent/p/10803394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!