前文
需求是针对render返回的结果进行数据搜索,初始想法是针对render返回的数据直接在前端进行数据遍历,但因为本身是分页,一次只能返回当页的结果,所以还是通过页面上的按钮向后台发起请求实现数据的更新。关于简单的table实现,如文章:django+easyui实现数据表格分页展示。
前端代码
在table前增加form表单,通过action跳转到对应的视图函数,详细代码如下:
<form action="{% url 'user_sql_search' %}" method="post" name="addForm" onsubmit="return submitFun();">
<input type="text" name="username">
<input type="submit" value="用户名查询" name="submit">
</form>
注意的是这边的url的名字是在django的urlpatterns里指定name的url,才能进行跳转。在form表单里实现onsubmit方法,这样可以防止非空提交。js部分如下:
<script type="text/javascript">
function submitFun(){
if(addForm.username.value==''){
alert("请输入用户名再查询");
return false;
}
}
</script>
后端代码
后端和之前的差别不大,可以用mysql-connector来实现sql语句,这样相对性能较好,并且可以实现比较复杂的语句。安装:
python -m pip install mysql-connector
在sql语句可以用like实现模糊搜索(如select * from table where username like ‘%xx%’),也可以直接用where和=实现精确搜索,详细代码如下:
def user_sql_search(request):
import mysql.connector
print(request.POST.get('username'))
content = request.POST.get('username')
if not content:
data = {}
data['status'] = 600
return HttpResponse(json.dumps(data), content_type='application/json')
sql = 'select * from table where username ="xx" ' #输入sql语句,指定where的精确匹配。
try:
conn = mysql.connector.connect(**config) # 指定host/port/db/user/ps等配置到config字典里
cursor = conn.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
print(rows)
except Exception as err:
logger.error(err)
raise
paginator = Paginator(rows, 20) #按20每页的数量显示
page = request.GET.get('page')
if page:
data_list = paginator.page(page).object_list
else:
data_list = paginator.page(1).object_list
try:
page_object = paginator.page(page)
except PageNotAnInteger:
page_object = paginator.page(1)
except EmptyPage:
page_object = paginator.page(paginator.num_pages)
return render(request, "detail.html", {
'page_object': page_object,
'data_list': data_list
})
后端的实现也是通过render重新返回页面来实现的,之前有尝试用ajax,但是由于模版数据是由前一个render实现的,ajax返回的数据无法及时刷新,所以最后还是决定再用render刷新页面来实现。
总结
这边仅提供我的简单实现代码,还可以进行优化或者其他更好的解决思路,可以一起探讨。