标题:django 表单 | 作者: catfish | 时间:2019年12月25日
暂无法显示图片

html表单的基本用法

获得表单的参数

request.POST.get('name', '')

用户登录

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect

user = authenticate(request, username=username, password=password)   # 认证函数
if user is not None:
	login(request, user) # 登录函数
	return redirect('/')
else:
	return render(request, 'error.html', {'message':"用户名或密码不正确"})

在template中判断表单是否登录

{% if user.is_authenticated %}

    <!-- 用户已登录 -->

{% else %}

    <!-- 用户未登录 -->

{% endif %}

注销登录

from django.contrib.auth import logout

logout(request)

注册功能

from django.contrib.auth.models import User

user = User(username=username)
user.set_password(password)
user.save()

# 或者下面,与上面等同
user = User.objects.create_user(username=username, password=password)

跳转登录

@login_required(login_url='/login/')
def userinfo(request):
    pass

Form表单验证

定义数据类型

以下是给出的例子:

from django import forms
from django.contrib import auth

class LoginForm(forms.Form):
    username = forms.CharField(label="用户名", min_length=5, widget=forms.TextInput(attrs={"placeholder": "请输入用户名"}), error_messages={'min_length':"至少要包含5个字符"})
    password = forms.CharField(label="密码", 
                           widget=forms.PasswordInput(attrs={"class": "form-control", "placeholder": "请输入密码"}))   
    email = forms.EmailField(label="电子邮箱", required=False, error_messages={'valid':'请输入正确的email!'})

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = auth.authenticate(username=username, password=password)
        if not user:
            raise forms.ValidationError("用户名或密码不正确")
        else:
            self.cleaned_data['user'] = user
        return self.cleaned_data

    def clean_username(self):
        username = self.cleaned_data.get('username')    # 当你取出这个字段值之后这个字段值就没有了
        if username == 'catfish':
            raise forms.ValidationError("不好意思,这是我的专用名!")
        return username

常见字段

CharField, EmailField, URLField

FloatField, IntegerField:max_value, min_value指定最大和最小值

属性

required:表单内是否接受被需要填写,默认为True。当它为True时传入一个None或者空字符串会引发异常。(ValidationError: ['This field is required.']label:将该字段指定为人类友好标签。label_suffix:自动添加的表单后缀。initial:指定表单初始化值。widget:指定小部件。help_text:放在表单旁边的帮助信息,span标签。error_message:覆盖默认错误信息。eg: name = forms.CharField(error_message={'required': 'Please enter your name'})validators:编写验证器。localize:设置为True使输出日期格式本地化。disabled:设置为True禁止用户编辑该表单的值。

自定义验证器

用法如下:

from django.core import validators

email = forms.CharField(validator=[validators.EmailValidator(message='请输入正确格式的邮箱!')])  # 电子邮箱验证
phone = forms.IntegerField(validator=[validators.RegexValidator(r'1[345678]\d{9}', message="请输入正确的手机号码!")]) #正则表达式验证手机号

#限制上传文件的扩展名
file = forms.FileField(validators=[validators.FileExtensionValidator(['txt','pdf'])])

可以使用的验证器有:MaxValueValidator, MinValueValidator, MinLengthValidator, MaxLengthValidator, EmailValidator, URLValidator, RegexValidator可供选择。

小部件widget

TextInput,NumberInput,EmailInput,URLInput,PasswordInput,HiddenInput,DateInput,DateTimeInput,TimeInput,Textarea可供选择。

在模板文件中使用

在模板文件中创建表单:

<!-- 四选一 -->
{{ login_form }}
{{ login_form.as_p }}
{{ login_form.as_table }}
{{ login_form.as_ul }}

在模板文件中捕获异常信息:

{{ login_form.errors.username.0 }}   {# 局部钩子 #}
{{ login_form.non_field_errors.0 }}  {# 全局钩子 #}

ModelForm的表单验证

ModelForm:模型和表单之间关系非常密切使用。传统模板和表单模板。

class MyForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__"  // exclude
        error_messages = {
            'page': {
                'requred':"请传入page参数"
                'invalid':"请输入一个可用的page"
            },
            'title':{
                'max_length':"不能超过100个字符"
            },
        }

如果要指定验证器就到模型中指定:

from django.core import validators
price = models.FloatField(validators=[validators.MaxValueValidator(limit_value=1000)])

save方法

form.save()直接将表单保存到数据库中。commit=False:只会生成一个User对象,不会保存到数据库中(赋值)

from django.contrib.auth.models import User

class BlogUserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='密码', widget=forms.PasswordInput)
    password2 = forms.CharField(label='再次输入密码', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email',)

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("两次密码不一致")
        return password2

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.source = 'adminsite'
            user.save()
        return user

 

我要评论

没有登录?请先登录后再评论

最新评论

暂无人评论,来抢个沙发吧!