Form表单 之ModelForm

ModelForm继承了Model和Form的双重功能,既可以处理Form内容,又可以处理Model数据库(是不是非常好用)。

1、实现form表单数据直接创建于更新

2、实现Model字段合规性检测;

3、实现input代码生成,传递到HTML自动生成input标签;

4、自定义Model字段,例如实现正则检测。

 

forms.py配置

class UserForm(forms.ModelForm):
    username = fields.CharField(
        required=True,
        max_length=10,
        min_length=5,
        error_messages={"required": "用户名不能为空"},
        widget=widgets.TextInput(attrs={
            "class": "form-control",
            "id": "reg-username",
            "placeholder": "Username"
        })
    )
    password = fields.CharField(
        required=True,
        max_length=10,
        min_length=5,
        error_messages={"required": "密码不能为空"},
        widget=widgets.PasswordInput(attrs={
            "class": "form-control",
            "id": "reg-password",
            "placeholder": "password"
        })
    )
    email = fields.CharField(
        required=True,
        max_length=10,
        error_messages={"required": "邮箱不能为空", "invalid": "邮箱格式错误"},
        widget=widgets.EmailInput(attrs={
            "class": "form-control",
            "id": "reg-email",
            "placeholder": "email"
        })
    )

    class Meta:
        model = UserInfo
        fields = ["username", "password", "email"]   # 或者 “__all__”

    def clean_password(self):
        """
        密码复杂度检测,密码必须包含大小写字母、数字、特称字符,至少8位,最多30位。
        """
        password = self.cleaned_data["password"]
        regex_password = "(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,30}"
        p = re.compile(regex_password)
        if p.match(password):
            return password
        else:
            raise forms.ValidationError("密码复杂度不符合要求,密码必须包含大小写字母、数字、特称字符,至少8位,最多30位。", code="password_invalid")

 

views.py配置

class RegisterView(View):
    """
    注册视图
    """
    def get(self, request):
        register_obj = UserForm()
        return render(request, "register.html", locals())

    def post(self, request):
        register_obj = UserForm(request.POST)
        if register_obj.is_valid():
            register_obj.save(commit=True)
            return render(request, "register_success.html")
        else:
            return render(request, "register.html", {"register_obj": register_obj})

 

HTML配置

<form class="form-horizontal reg-form" action="{% url "register" %}" method="post" novalidate>
    <span class="heading reg-ok">User Register</span>
    <div class="form-group reg-remove">
        {{ register_obj.username }}
        <i class="fa fa-user"></i>
        <p id="reg-p-u">{{ register_obj.errors.username }}</p>
        <i id="reg-i-u" style="display: none">0</i>
    </div>
    <div class="form-group help reg-remove">
        {{ register_obj.password }}
        <i class="fa fa-lock"></i>
    </div>
    <div class="form-group help reg-remove">
        <input type="password" class="form-control" id="reg-password2"
               placeholder="Repeat Password">
        <i class="fa fa-lock"></i>
        <p id="reg-p-p">{{ register_obj.errors.password }}</p>
        <i id="reg-i-p" style="display: none">0</i>
    </div>
    <div class="form-group reg-remove">
        {{ register_obj.email }}
        <i class="fa fa-envelope-o"></i>
        <p id="reg-p-e">{{ register_obj.errors.email }}</p>
    </div>
    <div class="form-group reg-remove">
                <span class="text" id="login" style="cursor: pointer; font-size: 15px"><a
                        href="{% url "login" %}">注册成功? 立即登录</a></span>
        <input id="reg-submit" type="submit" class="btn btn-default" value="Register">
    </div>
    {% csrf_token %}
</form>

 

Form.Instance(直接对User表进行更新)

示例:对User image进行更新

image_form = UploadImageForm(request.POST, request.FILES, instance=request.user)

if image_form.is_valid():

  image_form.save()

posted @ 2017-03-05 22:53  Vincen_shen  阅读(327)  评论(0)    收藏  举报