我正在研究一个孩子的电子邮件程序,在单击“全部答复”后,该复选框将使用适当的邮件收件人填充复选框。在创建回复电子邮件的模板时,我需要动态生成选择以及预先选中的框。一切正常,除了不选中复选框。我在这里阅读了很多相关的问题,但是都没有直接从查询集中填充。我不知道如何/在哪里设置“初始”。为确保我的过滤器不会引起问题,我将queryset和initial都设置为相同的值,期望所有的框都被选中,而没有一个被选中。感谢您的帮助。
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 %}
答案 0 :(得分:0)
否,因为您特别避免使用Django提供的帮助程序来填充字段。模板中实际上没有任何内容可以告诉浏览器显示选中的任何复选框。
您应该让Django进行操作,而不是手动遍历收件人的选择;只需用
替换所有模板代码{{ form.recipients }}
请注意,您实际上不应该在视图中修改字段本身;最好将initial作为参数传递给表单实例化。