2010-12-07 9 views
0

J'ai une liste d'emplois, chacun faisant partie d'un groupe:Django: comment mettre en évidence des groupes dans un `SelectField`?

class Job(models.Model): 
    name = models.CharField(max_length = 200) 
    group = models.CharField(max_length = 200) 

Comment puis-je afficher un SelectField, dans lequel les groupes sont mis en surbrillance et les emplois correspondants sont énumérés ci-dessous?

J'ai vu this ce message que je serais un premier pas, mais je voudrais plus de détails.

grâce

Répondre

1

Vous voudrez peut-être penser à faire group un ForeignKey à un modèle Group, mais avec le modèle étant donné que vous pourriez tirer profit du fait que les ChoiceFields de formulaires Django allow vous specify groups for choices, qui sont rendus comme <optgroup> s:

from itertools import groupby 
from operator import attrgetter 

from django import forms 

from myapp.models import Job 

def get_grouped_job_choices(): 
    choices = [] 
    for group, jobs in groupby(Job.objects.all().order_by('group', 'name'), 
           attrgetter('group')): 
     choices.append((group, [(job.pk, job.name) for job in jobs])) 
    return choices 

class ExampleForm(forms.Form): 
    job = forms.ChoiceField(choices=get_grouped_job_choices) 
+0

Je aime vraiment la méthode, mais je l'erreur suivante: 'Pris TypeError tout en rendant: objet « fonction » est pas iterable' et je ne vois pas d'où il vient . – Mermoz

+0

ok, cela vient du fait que vous avez oublié les crochets dans 'job = forms.ChoiceField (choices = get_grouped_job_choices())' – Mermoz

+0

Pour utiliser ceci dans un modèle au lieu d'un formulaire, vous devez utiliser un 'IntegerField' et non un 'CharField' (voir http://osdir.com/ml/django-users/2010-05/msg00760.html) sinon vous obtenez une" erreur de valeur " – Mermoz

1

insin a fourni un bon moyen de le faire. Mais il y a un tag de template django intégré pour faire exactement cela!

Vous pouvez le faire en utilisant la balise modèle regroup.

De l'docmentation,

{% regroup job by group as group_list %} 

<ul> 
{% for group in gender_list %} 
    <li>{{ group.grouper }} 
    <ul> 
     {% for item in group.list %} 
     <li>{{ item }} </li> 
     {% endfor %} 
    </ul> 
    </li> 
{% endfor %} 
</ul> 
+0

sympa! Cependant, je ne vois pas comment brancher cela dans un 'ChoiceField' – Mermoz

+0

Vous ne pouvez pas. Vous devez probablement créer un widget qui suit les mêmes chemins de balise de modèle. –

Questions connexes