如何实现点击按钮切换Django查询的order_by排序规则?
问题原因
- 提交按钮未被
<form>标签包裹,点击后不会触发POST请求,后端始终执行GET请求对应的排序逻辑 method是<form>标签的专属属性,写在<button>标签上不生效- Django默认要求POST请求携带CSRF令牌,缺少令牌会导致请求被拦截
修复方案
1. 修改publications.html模板代码
替换原有按钮部分为如下带form的代码即可实现点击按日期排序:
<form method="POST"> {% csrf_token %} <button type="submit">按日期筛选</button> </form> <ol class="text"> {% for publication in publications %} <div>{{publication.text}}</div> {% endfor %} </ol>
2. (可选)实现双向切换排序
如果需要点击按钮可以在两种排序规则之间来回切换,可以修改视图逻辑,用session存储当前排序状态:
def publications(request): # 初始化默认排序规则 if 'sort_by' not in request.session: request.session['sort_by'] = 'contributors' # POST请求时切换排序规则 if request.method == 'POST': request.session['sort_by'] = 'status_date' if request.session['sort_by'] == 'contributors' else 'contributors' # 标记session已修改确保更新 request.session.modified = True # 按当前存储的规则排序 publications = UserPublications.objects.all().order_by(request.session['sort_by']) context = {'publications': publications} return render(request, 'users/publications.html', context)
内容的提问来源于stack exchange,提问作者awawawaw
相关产品推荐
相关产品推荐

