2015-11-25 1 views
0

Je suis relativement nouveau à Django, et j'ai essayé de trouver un moyen d'implémenter un champ ManyToMany dont les 'choix' visibles dans l'interface utilisateur changent basé sur un BooleanField trouvé dans le même modèle. Par exemple, supposons que j'ai un modèle qui représente différents travaux et un modèle de travailleur qui a une relation manytomany avec ce modèle de travail. Supposons également qu'il existe deux types de travailleurs: un manager et un non-manager qui est représenté comme un BooleanField. Si vous êtes un gestionnaire, vous avez certains emplois qu'un travailleur n'a pas et vice versa. J'essaye de trouver un moyen, sans créer une nouvelle table, de l'avoir tel que les travaux listés dans la relation manytomany dépendent de la valeur booléenne de 'is_manager'. En d'autres termes, si vous cliquiez sur 'is_manager', cela devrait répertorier les tâches propres au responsable, mais ces tâches spécifiques au gestionnaire se trouvent dans la même table que les tâches non-manager - celles-ci seraient simplement vides.ManyToMany champ modèle où les choix changent basé sur boolean

J'ai regardé dans le domaine de la transition, etc, mais toutes les solutions que je propose semblent dépendre d'une autre table. Je suis sûr qu'il y a un moyen de faire mieux.

Merci.

+0

Je suis un grand confus. Ce que vous décrivez ne semble pas lié au modèle mais surtout à l'interface. Comment créez-vous le formulaire? –

+0

Qu'entendez-vous par "faire une table"? Gérez-vous votre base de données manuellement pour une raison quelconque? Aussi, mon intuition est que la solution à votre problème réside dans la création d'un "RelatedManager" personnalisé pour votre champ de plusieurs à plusieurs. Voir https://docs.djangoproject.com/en/dev/topics/db/managers/#manager-types, mais aussi, @xbirkettx fait un point valable ... Que voulez-vous dire par «dans l'interface utilisateur»? Si vous faites référence à l'administrateur de Django, alors ma solution peut vous aider, mais si vous voulez dire sur le frontend d'une page web, il y a beaucoup d'outils à votre disposition pour limiter cela sur le frontal plutôt que dans la base de données. –

Répondre

0

Je propose cette approche:

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     fields = ['jobs', 'username'] 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     instance = kwargs.get('instance', None) 
     if instance is not None: 
      if instance.is_manager: 
       self.fields['jobs'].queryset = Jobs.objects.filter(manager=True) 
      else: 
       self.fields['jobs'].queryset = Jobs.objects.filter(manager=False)