Django视图如何获取模板checkbox值 保留筛选条件切换归档图书
解决方案
1. 视图层统一归档筛选逻辑
删掉单独的commit_list_archived视图,所有归档筛选逻辑收敛到公共的show_book_list函数,确保不管走哪个筛选入口(按作者、按年份等)都会统一应用归档状态过滤:
def show_book_list(request, blist, template_args, **kwargs): # 从请求参数获取归档展示状态,默认展示未归档图书 show_archived = request.GET.get('archived') == '1' # 给当前待筛选的图书列表先加归档条件过滤 blist = blist.filter(is_archived=show_archived) data = { 'genre': None, 'show_archived': show_archived } try: # 原有筛选逻辑保持不变 blist = dataview.book_list(blist, **kwargs) except dataview.DataViewError as e: blist = None data['error'] = str(e) try: data['books'] = RequestPages(request, blist, desc=True) except Exception as e: if not utils.is_db_regex_exception(e): raise data['books'] = None data['error'] = 'Invalid regex.' data['genres'] = models.Genre.objects.order_by('kind', 'name') data.update(kwargs) data.update(template_args) return render(request, 'book_list.html', data)
2. 模板层实现带原有参数的归档切换控件
在book_list.html中添加归档切换的GET表单,自动保留当前所有筛选参数,仅修改归档状态:
<!-- 归档切换控件 --> <form method="get" action=""> <!-- 遍历当前所有查询参数,生成隐藏域保留原有筛选条件 --> {% for key, value in request.GET.items %} {% if key != 'archived' %} <input type="hidden" name="{{ key }}" value="{{ value }}"> {% endif %} {% endfor %} <label> <input type="checkbox" name="archived" value="1" onchange="this.form.submit()" {% if show_archived %}checked{% endif %} > 展示已归档图书 </label> </form>
这个表单提交后会停留在当前列表页,原有筛选条件全部保留,仅切换归档展示状态,无需额外跳转。
3. 单本归档操作优化(可选)
如果之前的单本归档返回逻辑偶发参数丢失,可以修改归档处理视图的跳转逻辑,直接读取请求头中的来源地址跳转:
def toggle_book_archived(request, book_id): book = get_object_or_404(models.Books, id=book_id) book.is_archived = not book.is_archived book.save() # 直接跳转回之前的列表页,完整保留所有查询参数 next_url = request.META.get('HTTP_REFERER', '/books/') return redirect(next_url)
内容的提问来源于stack exchange,提问作者user16541120
相关产品推荐
相关产品推荐

