Как получить шаблонный тег для автоматической проверки флажка в Django - PullRequest
1 голос
/ 15 марта 2010

Я использую класс ModelForm для генерации нескольких флажков для ManyToManyField, но столкнулся с одной проблемой: хотя поведение по умолчанию автоматически проверяет соответствующие поля (когда я редактирую объект), я могу ' не могу понять, как получить эту информацию в моем собственном шаблонном теге.

Вот что у меня есть в моей модели:

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

И на мой взгляд:

from myproject.myapp.models import MyModel,MyForm

obj = MyModel.objects.get(pk=1)
f   = MyForm(instance=obj)

return render_to_response(
    "path/to/form.html", {
        "form": f,
    },
    context_instance=RequestContext(request)
)

И в моем шаблоне:

{{ 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)

Дело в том, что я делаю это только для того, чтобы обернуть какую-то более простую разметку вокруг этих блоков, поэтому, если кто-то знает, как сделать это проще, я весь в ушах. Я был бы рад узнать, как получить доступ к тому, стоит ли отмечать флажок.

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

В вашем теге input для этого флажка вы можете просто добавить атрибут 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
)
0 голосов
/ 16 марта 2010

Получается искомое значение, элементы в списке, которые были "отмечены", находятся не в 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]

...