python - CheckboxSelectMultiple 不会预先选中初始值设置为查询集的复选框
问题描述
我正在开发一个儿童电子邮件程序,该程序将在单击“全部回复”后使用适当的邮件收件人填充复选框。当我为回复电子邮件创建模板时,我需要动态生成选项以及预先选中的框。一切正常,只是没有选中这些框。我在这里阅读了很多相关的问题,但没有一个是直接从查询集中填充的。我不明白如何/在哪里设置“初始”。为了确保我的过滤器没有引起问题,我将查询集和初始值都设置为相同的值,希望所有的框都被选中,但没有一个。谢谢你的帮助。
forms.py:
class EmailForm(forms.Form):
recipients = forms.ModelMultipleChoiceField(queryset=None,
widget=forms.CheckboxSelectMultiple)
email_views.py:
def email_compose_show(request, reply_type, email_id):
if reply_type == 'reply-all':
msg = Mail.objects.get(id=email_id)
qs = CustomUser.objects.filter(id__in=get_users(request.user.id)).exclude(id=request.user.id)
form = EmailForm(initial={'message': msg.message, 'subject': msg.subject})
recipients = forms.ModelMultipleChoiceField(
label="Recipients",
widget=forms.widgets.CheckboxSelectMultiple,
queryset=qs,
initial=qs
)
form.fields['recipients'] = recipients
template:
{% for x,y in form.fields.recipients.choices %}
<label for="id_recipients_{{forloop.counter0}}">
<input type="checkbox" name="recipients"
id="id_recipients_{{forloop.counter0}}" value="{{ x }}"> {{ y }}
</label>
{% endfor %}
解决方案
不,因为您特别避免使用 Django 提供的帮助程序来填充该字段。模板中实际上没有任何内容可以告诉浏览器将任何复选框显示为选中状态。
与其手动遍历收件人选择,不如让 Django 来做;将所有模板代码替换为
{{ form.recipients }}
请注意,您真的不应该在视图中修改字段本身;最好将 initial 作为参数传递给表单实例化。
推荐阅读
- office365 - 有没有办法使用 Microsoft Graph 读取和/或更新帐户选项
- python - 为什么我的 matplotlib 图的图例总是被裁剪?
- batch-file - 需要编写一个批处理脚本将单个 EXCEL 文件复制到 EXCEL 文件当前所在的所有子文件夹中
- reactjs - React js 实现 CKeditor 或 Draft
- delphi - 未分配 SOAP 响应类(无)
- python - Python,sqlalchemy:如何提高加密sqlite数据库的性能?
- perl - 打印 grep -c return 时的奇怪输出
- python - 列表理解和“'list'和'float'的实例之间不支持”
- angular - APP_INITIALIZER 未在出厂前触发
- reverse-dns - 域和 rDNS 数据不匹配