Frage

Ich verwende eine Modelform Klasse eine Reihe von Kontrollkästchen für einen ManyToManyField zu erzeugen, aber ich habe zu einem Problem führen: während das Standardverhalten die entsprechenden Felder automatisch überprüft (wenn ich ein Objekt bin der Bearbeitung), kann ich‘ t herauszufinden, wie diese Informationen in meinem eigenen benutzerdefinierten TemplateTag zu erhalten.

Hier ist, was ich in meinem Modell habe:

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

Und meiner Ansicht nach:

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

Und in meiner Vorlage:

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

Und hier ist mein 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)

Die Sache ist, ich mache das nur, damit ich etwas einfacher Markup um diese Boxen wickeln kann, also wenn jemand weiß, wie man das in einem einfacheren Weg passieren, ich bin ganz Ohr. Ich würde gerne mit einem Weg, um Zugang zu wissen, ob eine Box allerdings überprüft werden soll.

War es hilfreich?

Lösung 2

Stellt sich heraus, der Wert, den ich suchte, die Elemente in der Liste, die „geprüft“ wurden, ist nicht in der field, sondern Teil des form Objekt. Ich wieder daran gearbeitet, die Template-Tag wie folgt aussehen und es tut genau das, was ich brauche:

@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

Für diejenigen, die kommen könnten, nach Kenntnis, dass der checked Wert oben gefunden wurde in boxes.form.initial[boxes.name]

Andere Tipps

Ihre input -Tag für das Kontrollkästchen, können Sie einfach fügen Sie die aktiviert Attribut auf einer Bedingung basiert. Sagen Sie Ihre Box Objekt hat die Eigenschaft aktiviert , den Wert entweder „geprüft“ oder leere Zeichenkette „“

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
)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top