2017-09-27 7 views
0

J'essaie de créer un menu déroulant personnalisé pour un modelForm. En ce moment, la forme du modèle montre juste toutes les unités sans hiérarchie. Je voudrais la forme d'une boîte de sélection comme parent/enfant ordonné par le collège puis par leurs services sous euxFournir Custom Select sur ModelForm

<select> 
<option value="10000">COLLEGE A</option> 
<option value="10001"> DEPT A</option> 
<option value="10002"> DEPT B</option> 
<option value="20000">COLLEGE B</option> 
<option value="20001"> DEPT C</option> 
..... 
</select> 

J'ai un modèle de toutes les « unités » sur notre campus. Si le parent est None alors c'est un collège. Chaque département pointe vers un collège.

class Units(models.Model): 
    unit_name = models.CharField(max_length=255) 
    enabled = models.BooleanField(default=True) 
    parent = models.ForeignKey("self", null=True) 

    def __str__(self): 
     if self.parent: 
      return self.parent.unit_name + ': ' + self.unit_name 
     else: 
      return self.unit_name 

J'abstraire ma classe User comme suit afin que tous mes utilisateurs peuvent avoir une unité associée

class Profile(AbstractUser): 
    associated_unit = models.ForeignKey(Units) 
    ........... 

Sur l'écran qui édite l'utilisateur que je veux la liste déroulante de associated_unit à la liste, il hiérarchie comme ci-dessus et pas si linéaire. C'est ce que j'ai obtenu à ce jour pour que le formulaire liste uniquement les unités "activées".

forms.py

class UserForm(ModelForm): 
class Meta: 
    model = Profile 
    fields = ('id', 'first_name', 'last_name', 'username', 'is_active', 'associated_unit') 

def __init__(self, **kwargs): 
    super(UserForm, self).__init__(**kwargs) 
    self.fields['associated_unit'].queryset = Units.objects.filter(enabled=True).order_by('parent__unit_name', 'unit_name') 

Comment puis-je faire pour créer une coutume sélectionner déroulant comme indiqué ci-dessus? Toute aide est appréciée. Fatigué de l'expérimentation et de la recherche: D

Répondre

0

j'ai changé la dernière ligne: self.fields [ 'associated_unit'] = choix my_list.. Semble économiser maintenant: D

class UserForm(ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('first_name', 'last_name', 'username', 'is_active', 'associated_unit') 

    def __init__(self, *args, **kwargs): 
     super(UserForm, self).__init__(*args, **kwargs) 
     my_list = [] 

     colleges = Units.objects.filter(parent=None, enabled=True).order_by('unit_name') 
     for college in colleges: 
      my_list.append((college.id, college.unit_name)) 

      departments = Units.objects.filter(parent=college.id, enabled=True).order_by('unit_name') 
      for department in departments: 
       my_list.append((department.id, " => " + department.unit_name)) 

     self.fields['associated_unit'].choices = my_list 
0

J'ai trouvé cela au travail. Peut-être pas la meilleure solution, mais cela fonctionne. Impossible d'afficher les espaces blancs dans la zone de sélection, mais pour le nom du collège/département.

Utilisé un> à la place.

from users.models import Profile 
from units.models import Units 
from django.forms import ModelForm, ChoiceField 


class UserForm(ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('id', 'first_name', 'last_name', 'username', 'is_active', 'associated_unit') 

    def __init__(self, **kwargs): 
     super(UserForm, self).__init__(**kwargs) 
     my_list = [] 

     colleges = Units.objects.filter(parent=None, enabled=True).order_by('unit_name') 
     for college in colleges: 
      my_list.append((college.id, college.unit_name)) 

      departments = Units.objects.filter(parent=college.id, enabled=True).order_by('unit_name') 
      for department in departments: 
       my_list.append((department.id, " => " + department.unit_name)) 

     self.fields['associated_unit'] = ChoiceField(choices=my_list) 
+0

Pas encore sorti du bois. Maintenant, je reçois cette erreur lorsque je sauvegarde le formulaire. Retour à la planche à dessin. Impossible d'affecter "'12006" ":" L'unité Profile.associated "doit être une instance" Unités ". –