Django开发密码生成器提交后如何保留checkbox勾选状态
问题修复方案
根因说明
问题由两处错误导致:
- 视图层没有将用户勾选的字母、数字、特殊字符的状态值传递到模板上下文,模板无法读取用户上次的选择
- 模板里的复选框硬编码了
checked属性,没有根据传入的状态动态渲染勾选状态
第一步:修改视图代码
调整后的视图代码如下,补全了上下文参数,同时优化了复选框参数的默认值逻辑(首次进入页面默认全勾选,提交后取用户实际选择):
import string import random import pyperclip from django.contrib import messages def view_passwordgenerator(request): # 首次加载无GET参数时默认全勾选,提交后取用户选择的状态,未勾选则GET中无对应参数,值为False alphabets_b = request.GET.get('alphabets', 'on') == 'on' digits_b = request.GET.get('digits', 'on') == 'on' special_characters_b = request.GET.get('special_characters', 'on') == 'on' alphabets = string.ascii_letters * alphabets_b digits = string.digits * digits_b special_characters = "!@#$%^&*()" * special_characters_b characters = alphabets + digits + special_characters username = request.user.username # 边界处理:防止用户全不勾选导致随机选择报错 if not characters: messages.error(request, '请至少选择一种字符类型') context = { 'username': username, 'alphabets_b': alphabets_b, 'digits_b': digits_b, 'special_characters_b': special_characters_b, 'length': int(request.GET.get('length', 8)) } return render(request, 'home/passwordgenerator.html', context) if 'length' in request.GET: length = int(request.GET.get('length')) password = '' for i in range(length): password += random.choice(characters) pyperclip.copy(password) messages.info(request, '密码已复制到剪贴板') context = { 'password': password, 'length': length, 'username': username, 'alphabets_b': alphabets_b, 'digits_b': digits_b, 'special_characters_b': special_characters_b } return render(request, 'home/passwordgenerator.html', context) # 首次加载页面的上下文,默认长度8,全勾选 context = { 'username': username, 'length': 8, 'alphabets_b': True, 'digits_b': True, 'special_characters_b': True } return render(request, 'home/passwordgenerator.html', context)
第二步:修改模板代码
将硬编码的checked属性替换为动态判断逻辑,调整后的表单复选框部分代码如下:
<span class="fake_input_l"> Alphabet Letters: <input type="checkbox" name="alphabets" {% if alphabets_b %}checked{% endif %}> Digits: <input type="checkbox" name="digits" {% if digits_b %}checked{% endif %}> Special Characters: <input type="checkbox" name="special_characters" {% if special_characters_b %}checked{% endif %}> </span>
其他代码无需修改,修改后提交表单时用户的勾选状态就会正常保留。
内容的提问来源于stack exchange,提问作者FLYAX
相关产品推荐
相关产品推荐

