2010-03-15 4 views
1

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

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

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

А вот мой templatetag:

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

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

ответ

0

Оказывается, значение я искал, элементы в списке, которые были «проверены» не в 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]

3

В вашем ввода тег для флажка, вы можете просто добавить проверил атрибут основан на каком-то состоянии. Предположим, что ваш объект коробка имеет свойство проверяется какое значение либо «проверено» или пустая строка «»

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

Это вещь, объект box не имеет свойства «checked». Я пытаюсь выяснить, где я могу получить это значение, учитывая, что все, с чем я должен работать, это {{form.interests}}. Я предполагаю, что данные должны быть там, потому что, если я визуализую его без тега шаблона, флажки автоматически проверяются. –