【问题标题】:CheckboxSelectMultiple doesn't pre-check boxes with inital value set to querysetCheckboxSelectMultiple 不会预先选中初始值设置为查询集的复选框
【发布时间】:2019-01-10 06:31:53
【问题描述】:

我正在开发一个儿童电子邮件程序,该程序将在单击“全部回复”后使用适当的邮件收件人填充复选框。当我为回复电子邮件创建模板时,我需要动态生成选项以及预先选中的框。一切正常,只是没有选中这些框。我在这里阅读了很多相关的问题,但没有一个是直接从查询集中填充的。我不明白如何/在哪里设置“初始”。为了确保我的过滤器没有导致问题,我将查询集和初始值都设置为相同的值,希望所有框都被选中,但没有一个。感谢您的帮助。

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 %}

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    不,因为您特别避免使用 Django 提供的帮助程序来填充该字段。模板中实际上没有任何内容可以告诉浏览器将任何复选框显示为选中状态。

    您应该让 Django 来完成,而不是手动遍历收件人选择;只替换所有模板代码

    {{ form.recipients }}
    

    注意,您真的不应该在视图中修改字段本身;最好将 initial 作为参数传递给表单实例化。

    【讨论】:

    • 感谢您的回答 - 这很快就奏效了。但是,我希望为复选框获得并排布局。不知何故,我认为“选择”将包括检查状态,但我误解了它。必须有一个“已检查”属性,我可以在 标记内的 {% if %} 中捕获。有什么想法吗?
    • 意识到我可以通过测试用户在传递到上下文的收件人列表中的存在来解决这个问题,而不是测试这个选中的属性。但仍然对知识感到好奇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2021-02-26
    • 2014-08-28
    相关资源
    最近更新 更多