07 django管理系统 - 部门管理 - 搜索部门

时间:2024-10-15 08:38:40
在dept_list.html中,添加搜索框
    <div class="container-fluid">
        <div style="margin-bottom: 10px" class="clearfix">
            <div class="panel panel-default">
                <!-- Default panel contents -->
                <div class="panel-heading">
                    <a class="btn btn-primary" href="/dept/add/" role="button">添加部门</a>

                    <!--因为涉及到提交以及数据路径拼接,所以需要一个form表单,method为get-->
                    <div style="float: right">
                        <form class="form-inline" action="/dept/search/" method="get">
                            <!--添加搜索框-->
                            <!--name=q 非常的重要-->

                            <input type="text" class="form-control" name="q" placeholder="请输入要搜索的部门"
                                   aria-label="Recipient's username" aria-describedby="button-addon2">
                            <button class="btn btn-outline-secondary" type="submit" id="button-addon2">搜索
                            </button>

                        </form>
                    </div>
                </div>


                <div class="panel-body">
                    <div style="float: left">
                        <p>部门列表</p>
                    </div>
                    <!-- Table -->
                    <table class="table">
                        <thead>
                        <tr>
                            <th>ID</th>
                            <th>name</th>
                            <th>head</th>
                            <th>phone</th>
                            <th>email</th>
                            <th>address</th>
                            <th>操作</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for obj in queryset %}
                            <tr>
                                <td>{{ obj.id }}</td>
                                <td>{{ obj.name }}</td>
                                <td>{{ obj.head }}</td>
                                <td>{{ obj.phone }}</td>
                                <td>{{ obj.email }}</td>
                                <td>{{ obj.address }}</td>

                                <td>
                                    <a class="btn btn-success" href="/dept/{{ obj.id }}/edit_detail/"
                                       role="button">编辑部门</a>
                                    <a class="btn btn-danger" href="/dept/{{ obj.id }}/delete/" role="button">删除部门</a>
                                </td>
                            </tr>

                        {% endfor %}
                        </tbody>
                    </table>
                    {% if error %}
                        <div style="color: red;">
                            {{ error }}
                        </div>
                    {% endif %}
                </div>
            </div>
        </div>
    </div>

效果如下:

 通过action="/dept/search/",我们需要配置URL

urlpatterns = [
    # 部门管理
    path("dept/list/", dept.dept_list),
    path("dept/add/", dept.dept_add),
    path("dept/<int:nid>/edit_detail/", dept.dept_editdetail),
    path("dept/<int:nid>/delete/", dept.dept_delete),
    path("dept/search/", dept.dept_search),

]

接着去定义函数dept_search()的业务逻辑

def dept_search(request):
    """
    实现部门搜索功能的视图函数。

    此函数根据用户提交的搜索关键字,查询并返回匹配的部门列表。
    如果没有提供关键字,则返回所有部门的列表。

    参数:
    - request: HttpRequest对象,包含了请求的所有数据。

    返回:
    - 渲染后的'dept_list.html'模板,包含搜索结果或错误信息。
    """
 
    data_dict = {}  # 首先定义一个空的字典
    keyvalue = request.GET.get("q")  # 取到关键字
    print("keyvalue", keyvalue)
    if keyvalue:
        data_dict["name__contains"] = keyvalue
        print("data_dict", data_dict)
        res = models.Dept.objects.using("default").filter(**data_dict)
        print("res", res)

        if not res.exists():
            # 返回错误信息
            print("未找到匹配的部门,请输入正确的部门名称")
            return render(request, 'dept_list.html', {"error": "未找到匹配的部门,请输入正确的部门名称"})

        queryset = res.order_by("-id")
        print("queryset", queryset)
        return render(request, 'dept_list.html', {"queryset": queryset})

我们尝试搜索一下:

1)我搜索正确的部门,比如我搜2病区,注意看调试情况

 我们可以看到访问的具体情况,看红框

2) 假设我搜索空的

报错了,我们可以尝试修改代码

因为q没有默认值,这种没传值的情况下,我们直接显示全部列

"""搜索部门"""


def dept_search(request):
    """
    实现部门搜索功能的视图函数。

    此函数根据用户提交的搜索关键字,查询并返回匹配的部门列表。
    如果没有提供关键字,则返回所有部门的列表。

    参数:
    - request: HttpRequest对象,包含了请求的所有数据。

    返回:
    - 渲染后的'dept_list.html'模板,包含搜索结果或错误信息。
    """

    data_dict = {}  # 首先定义一个空的字典
    keyvalue = request.GET.get("q")  # 取到关键字
    print("keyvalue....", keyvalue)
    if keyvalue:
        data_dict["name__contains"] = keyvalue
        print("data_dict", data_dict)
        res = models.Dept.objects.using("default").filter(**data_dict)
        print("res", res)

        if not res.exists():
            # 返回错误信息
            print("未找到匹配的部门,请输入正确的部门名称")
            return render(request, 'dept_list.html', {"error": "未找到匹配的部门,请输入正确的部门名称"})

        queryset = res.order_by("-id")
        print("queryset", queryset)
        return render(request, 'dept_list.html', {"queryset": queryset})

    # 如果考虑的全面一点,如果q没被传值,则查询全部
    if keyvalue == "":
        res = models.Dept.objects.using("default").all()
        print("qis'',res is..", res)
        context = {
            'queryset': res
        }
        queryset = res.order_by("-id")
        print("queryset", queryset)
        return render(request, 'dept_list.html', {"queryset": queryset})

注意下调试的情况

可以看到输入为空的时候,也是可以查询到数据的

3)输入错误信息,即非部门信息,进行搜索

这样,搜索的功能,我们就完成了。