2017-09-30 1 views
0

Cela doit être une exigence commune, mais rien de ce que j'ai trouvé sur SO ou dans les documentations Django qui fonctionne pour moi. Je suis vraiment nouveau à Django. Mon problème: J'ai besoin de changer la liste des zones qui sont présentées dans une liste déroulante de formulaire en fonction de la société qui a la propriété de la zone.Liste déroulante Modifier/Filtrer basée sur la propriété

Dans mon application: Comptes (i.e. utilisateurs) sont membres de la Société. Une entreprise gère une zone. Dans la zone sont un certain nombre de routes. Les itinéraires peuvent être ajoutés/mis à jour/supprimés ou attribués à différentes zones par la Société.

donc sur mes formes Je veux faire en sorte que seules les zones qui appartiennent à une société sont affichés dans la liste déroulante. Essentiellement, un utilisateur sélectionne une zone, puis les routes CRUD associées à la zone.

class Company(models.Model): 
    name = models.CharField(... 
    account_number = models.CharField(... 
    ... 


class Account(models.Model): 
    name = models.OneToOneField(User... 
    company = models.ForeignKey(Company) 
    ... 

class Area(models.Model): 
    owner = models.ForeignKey(Company) 
    number = modes.PositiveIntegerField(... 

class Route(models.Model): 
    owner = models.ForeignKey(Company) 
    area = models.ForeignKey(Area) 

Dans forms.py

class RouteCreateForm(forms.ModelForm): 
    class Meta: 
     model= Route 
     fields= [ 
      'area', 
      'route_number', 
      ... 
     ] 

Ajout:

 self.fields['area'].queryset = Area.objects.filter(owner_id = 2) 

fournit le filtrage correct mais bien sûr n'est pas dynamique.

J'ai beaucoup de variations sur:

def __init__(self, *args, **kwargs): 
    ??how to pass in user to ultimately get to owner_id?? 
    self.fields['area'].queryset = Area.objects.filter(owner_id = owner_id) 

mais ne peut pas obtenir le milieu droit. J'ai aussi essayé en passant « utilisateur », mais les seuls résultats dans un TypeError à/compte/setup/itinéraire/créer initialisation() manquant 1 nécessaire argument de position: « utilisateur »

Répondre

1

Si vous utilisez générique CreateView, vous pouvez modifier votre formulaire par requête en remplaçant get_form() sur votre vue. Cela ressemblerait à ceci:

class RouteCreateView(generic.CreateView): 
    form_class = RouteCreateForm 

    def get_form(self): 
     form = super(RouteCreateView, self).get_form() 
     form.fields['area'].queryset = Area.objects.filter(owner=self.request.user) 
     return form