案例:员工管理系统2(员工:ModelForm改进添加用户)

一. 在user_list.htmlw文件中添加(改进添加用户)a超链接

       <div style="margin-bottom: 10px">
            <a class="btn btn-success" href="/user/add/">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                新建用户
            </a>

            <a class="btn btn-success" href="/user/model/form/add/">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                ModelForm新建用户
            </a>
        </div>

二 .在urls.py文件添加URL和视图函数对应关系

    # 用户系列
    path('user/list/', views.user_list),
    # path('user/add/', views.user_add),

    path('user/model/form/add/', views.user_model_form_add),  # 改进添加用户

]

三. 在views.py文件写视图函数

from django import forms

# 1.写一个类
class UserModelForm(forms.ModelForm):
    name = forms.CharField(min_length=2, label="用户名")  # 验证规定用户名输入字符串最小为2

    class Meta:
        model = models.UserInfo  # 重新定义字段
        fields = ["name", "password", "age", 'account', 'create_time', "gender", "depart"]  # 字段列表
        # widgets = {  # 给每个字段添加样式,笨办法
        #     "name": forms.TextInput(attrs={"class": "form-control"}),
        #     "password": forms.PasswordInput(attrs={"class": "form-control"}),
        #     "age": forms.TextInput(attrs={"class": "form-control"}),
        # }

    def __init__(self, *args, **kwargs):  # 重新定义类的初始属性
        super().__init__(*args, **kwargs)  # 只要重新执行就继承父类的初始属性
        # 循环找到所有的插件,添加了class="form-control"
        for name, field in self.fields.items():  # 循环找到所有的name 字段名和field=对象
            # if name == "password":  # 不想让x字段不加样式
            #     continue  # 绕过去
            # 对象.插件 = (每个对象添加上样式)
            field.widget.attrs = {"class": "form-control", "placeholder": field.label}

# 2 写函数
def user_model_form_add(request):
    """ 添加用户(ModelForm版本)"""
    if request.method == "GET":  # 如果GET方式提交
        form = UserModelForm()
        return render(request, 'user_model_form_add.html', {"form": form})

    # 用户POST提交数据,数据校验。
    form = UserModelForm(data=request.POST)  # 把POST提交数据传给UserModelForm就拿到数据
    if form.is_valid():  # 如果校验成功
        # 如果数据合法,保存到数据库(下面是拿到的数据)
        # {'name': '123', 'password': '123', 'age': 11, 'account': Decimal('0'), 'create_time': datetime.datetime(2011, 11, 11, 0, 0, tzinfo=<UTC>),
        # 'gender': 1, 'depart': <Department: IT运维部门>}
        # print(form.cleaned_data)
        # models.UserInfo.objects.create(..)
        form.save()  # 自动保存的数据库
        return redirect('/user/list/')  # 返回页面

    # 校验失败(在页面上显示错误信息)  在settings.py文件下找到LANGUAGE_CODE = 改为:LANGUAGE_CODE = 'zh-hans'  就显示 中文
    return render(request, 'user_model_form_add.html', {"form": form})

四. templates里写HTML文件

{% extends 'layout.html' %}  <!--继承layout.html模板 -->
{% block content %}
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"> 新建用户 </h3>
            </div>
            <div class="panel-body">
                <form method="post" novalidate>  <!--novalidate=关闭浏览器做的校验 -->
                    {% csrf_token %}  <!--模板语法测试表单 -->

                    {% for field in form %}  <!--循环取出字段 -->
                        <div class="form-group">  <!--样式 -->
                            <label>{{ field.label }}</label>  <!--取出每个字段的中文 -->
                            {{ field }}  <!--字段 -->
                            <span style="color: red;">{{ field.errors.0 }}</span>  <!--有错误信息就以红色显示出来 -->
                        </div>
                    {% endfor %}  <!-- 循环法结束 -->

                    <button type="submit" class="btn btn-primary">提 交</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}

五. 输入错误时显示中文提示

        在settings文件里添加:

# LANGUAGE_CODE = 'en-us'  # 
LANGUAGE_CODE = 'zh-hans'  # 显示中文

六.效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值