Bootstrap

寒假日记-6

使用modelform后,html和类的简便写法

以下为使用ModelForm的视图函数:

def update_depart(request):
    if request.method == "GET":
        # [1] GET请求处理:显示编辑表单
        # 从URL参数获取部门ID(注意:这里用GET方法获取路径参数,建议改为URL路径参数更规范)
        did = request.GET.get('did')
        
        # [2] 根据ID获取部门对象(使用filter+first避免get的DoesNotExist异常)
        # Model层操作:filter返回QuerySet,first()取第一个对象(可能为None)
        depart_obj = models.DepartInfo.objects.filter(id=did).first()
        
        # [3] ModelForm关键功能:用instance参数绑定模型实例
        # 自动将depart_obj的字段值填充到表单控件中(初始化表单数据)
        form = DepartModelForm(instance=depart_obj)
        
        # [4] 渲染带数据的表单页面
        return render(request, 'update_depart.html', {'form': form})

    # [5] POST请求处理:提交表单数据更新
    # 再次获取部门ID(注意:这里用GET方法获取参数在POST请求中不规范,建议改用隐藏表单字段传递)
    did = request.GET.get('did')
    
    # [6] 再次查询要修改的部门对象(可优化:合并到后面)
    depart_obj = models.DepartInfo.objects.filter(id=did).first()
    
    # [7] ModelForm核心功能:同时处理数据和实例
    # data=request.POST 接收用户提交的数据
    # instance=depart_obj 绑定要修改的实例(实现更新而非新建)
    form = DepartModelForm(data=request.POST, instance=depart_obj)
    
    # [8] 自动验证表单数据(结合模型字段的校验规则)
    if form.is_valid():
        # [9] ModelForm的保存机制:
        # 当instance不为空时,执行UPDATE操作
        # 当instance为空时,执行INSERT操作(此处需防范did无效导致意外新建)
        form.save()  # 自动将表单数据保存到绑定的depart_obj
        
        # [10] 跳转到部门列表页(应使用reverse反向解析URL更规范)
        return redirect('/depart/list/')
    else:
        # [11] 验证失败显示错误信息(form会自动携带错误信息到模板)
        return render(request, 'update_depart.html', {'form': form})

补充:{{ form.as_? }}可自动生成html段落,如:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}  <!-- 自动生成段落式表单 -->
    <button type="submit">提交</button>
</form>

{# 等价于 #}
<p>
    <label for="id_title">标题:</label>
    <input type="text" name="title" id="id_title" required>
</p>
<p>
    <label for="id_content">内容:</label>
    <textarea name="content" id="id_content" required></textarea>
</p>

至此完成modelform的学习,并且进阶django告一段落。

;