如何让模板标记在Djang中自动选中复选框

2024-10-06 12:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个ModelForm类为一个ManyToManyField生成一堆复选框,但是我遇到了一个问题:当我编辑一个对象时,默认行为会自动检查相应的复选框,但我不知道如何在我自己的自定义templatetag中获取这些信息。在

我的模型是这样的:

from myproject.interests.models import Interest


class Node(models.Model):
    interests   = models.ManyToManyField(Interest, blank=True, null=True)


class MyForm(ModelForm):

    from django.forms import CheckboxSelectMultiple, ModelMultipleChoiceField

    interests = ModelMultipleChoiceField(
        widget=CheckboxSelectMultiple(), 
        queryset=Interest.objects.all(),
        required=False
    )

    class Meta:
        model = MyModel

在我看来:

^{pr2}$

在我的模板中:

{{ form.interests|alignboxes:"CheckOption" }}

这是我的模板标签:

@register.filter
def alignboxes(boxes, cls):
    """
        Details on how this works can be found here:
            http://docs.djangoproject.com/en/1.1/howto/custom-template-tags/
    """

    r = ""
    i = 0
    for box in boxes.field.choices.queryset:
        r += "<label for=\"id_%s_%d\" class=\"%s\"><input type=\"checkbox\" name=\"%s\" value=\"%s\" id=\"id_%s_%d\" /> %s</label>\n" % (
            boxes.name,
            i,
            cls,
            boxes.name,
            box.id,
            boxes.name,
            i,
            box.name
        )
        i = i + 1

    return mark_safe(r)

问题是,我这样做只是为了能在这些框上包装一些更简单的标记,所以如果有人知道如何以更简单的方式实现这一点,我会全神贯注地听。我很乐意知道一种方法来访问是否应该检查一个盒子。在


Tags: namefromimportboxidtruemodelsclass
2条回答

原来我要查找的值,列表中“checked”的元素不在field中,而是form对象的一部分。我重新处理了模板标记,使其看起来像这样,它确实满足了我的需要:

@register.filter
def alignboxes(boxes, cls):

    r = ""
    i = 0
    for box in boxes.field.choices.queryset:
        checked = "checked=checked" if i in boxes.form.initial[boxes.name] else ""
        r += "<label for=\"id_%s_%d\" class=\"%s\"><input type=\"checkbox\" name=\"%s\" value=\"%s\" id=\"id_%s_%d\" %s /> %s</label>\n" % (
            boxes.name,
            i,
            cls,
            boxes.name,
            box.pk,
            boxes.name,
            i,
            checked,
            box.name
        )
        i = i + 1

    return r

对于后面的人,请注意上面的checked值是在boxes.form.initial[boxes.name]中找到的

在复选框的输入标记中,可以根据某些条件添加checked属性。假设您的box对象具有属性checked,该属性值为“checked”或空字符串“”

r += "<label for=\"id_%s_%d\" class=\"%s\"><input type=\"checkbox\" name=\"%s\" value=\"%s\" id=\"id_%s_%d\" %s /> %s</label>\n" % (
    boxes.name,
    i,
    cls,
    boxes.name,
    box.id,
    boxes.name,
    i,
    box.checked,
    box.name
)

相关问题 更多 >