/ / Come ottenere un tag modello per controllare automaticamente una casella in Django - python, django, templatetags

Come ottenere un tag modello per auto-controllare una casella di controllo in Django - python, django, templatetags

Sto usando una classe ModelForm per generare un gruppodi caselle di controllo per ManyToManyField ma ho riscontrato un problema: mentre il comportamento predefinito controlla automaticamente le caselle appropriate (quando sto modificando un oggetto), non riesco a capire come ottenere tali informazioni nel mio templatetag personalizzato.

Ecco "quello che ho" nel mio modello:

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

E a mio avviso:

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

E nel mio modello:

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

Ed ecco il mio 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)

Il fatto è che lo sto solo facendo in modo da poterlo avvolgereun markup più semplice attorno a queste caselle, quindi se qualcuno sa come farlo accadere in modo più semplice, sono tutti orecchi. Sarei felice di sapere un modo per accedere se una casella dovrebbe essere selezionata o meno.

risposte:

3 per risposta № 1

Nel tuo ingresso tag per la casella di controllo, puoi semplicemente aggiungere il verificato attributo basato su alcune condizioni. Supponiamo che il tuo oggetto box abbia proprietà verificato quale valore è "controllato" o stringa vuota ""

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 per risposta № 2

Risulta il valore che stavo cercando, gli elementi nella lista che sono stati "controllati" non sono nel field, ma piuttosto parte del form oggetto. Ho rielaborato il tag modello in questo modo e fa esattamente quello di cui ho bisogno:

@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

Per coloro che potrebbero venire dopo, notare che il checked il valore sopra è stato trovato in boxes.form.initial[boxes.name]