2017-09-15 2 views
0

J'essaie de créer un formulaire qui fusionne des éléments à partir de deux endroits différents. Je pense que la meilleure façon de le faire peut être deux formes différentes et de les montrer sur la même page, à moins que quelqu'un d'autre puisse m'aider à tout faire sous une forme?Créer un formulaire qui utilise les attributs de 2 modèles différents

Je ne vois aucun problème à utiliser 2 formulaires mais je ne sais pas comment procéder (et peut-être que je n'en ai pas besoin!).

J'ai 2 classes qui sont quelque peu liées: Personne (Utilisateur) et Ami et ils partagent des Avantages Personels.

modèles ressemblerait à ceci:

class PersonBenefit(models.Model): 
    benefit = models.ForeignKey(Benefit, null=True) 
    user = models.ForeignKey(User) 

class Friend(models.Model): 
    first_name = models.CharField(max_length=40) 
    last_name = models.CharField(max_length=40) 
    has_benefit = models.BooleanField(default=False) 
    ben_id_num = models.CharField(max_length=10, blank=True, null=True) 
    person = models.ForeignKey(User) 

#good, better, best 
class BenefitType(models.Model): 
    name = models.CharField(max_length=25) 

    def __str__(self): 
     return self.name 


class Benefit(models.Model): 
    type = models.ForeignKey(BenefitType) 
    name = models.CharField(max_length=25) 

Le forms.py ressemble à ceci:

class GoodBenefitForm(forms.Form): 
    benefit = forms.ModelChoiceField(
     queryset=Benefit.objects.filter(type__name='Good'), 
     widget = forms.Select(attrs={'class':'g-1-3'}) 
    ) 
# THIS SHOWS A LIST OF ALL THE FRIENDS FOR THIS USER - DISPLAYS THEIR NAMES NICELY WITH CHECKBOXES 
    friend = forms.ModelMultipleChoiceField(
     queryset = Friend.objects.none(), 
     widget = forms.CheckboxSelectMultiple(), 
    ) 
# I WANT THIS TO BE A BUNCH OF TEXTBOXES INSTEAD OF CHECKBOXES - ONE FOR EACH FRIEND FOR THE USER 
    friend_group_id = forms.ModelMultipleChoiceField(
     queryset = Friend.objects.none(), 
     widget = forms.CheckboxSelectMultiple(), 
    ) 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     queryset = Friend.objects.filter(person=self.user) 
     super(FriendBenefitForm, self).__init__(*args, **kwargs) 
     self.fields['friend'].queryset = queryset 
     self.fields['friend_group_id'].queryset = queryset 

Essentiellement, je suis en train d'obtenir le formulaire pour afficher la liste des « amis » Avec des cases à cocher, puis à côté de leur nom, affichez un champ de texte que l'utilisateur peut entrer ben_id_num

Encore une fois, après avoir lu, je pense qu'ayant 2 formulaires séparés peut être le meilleur moyen d'y aller, mais je ne suis pas sûr que je fasse quelque chose de stupide dans mon forms.py tel quel et que cela fonctionne avec un seul formulaire.

Ce serait essentiellement:

Pour chaque « ami », afficher une petite forme qui a une case à cocher avec le nom d'amis et un champ de texte, il suit immédiatement (ce qui correspond à leur ben_id_num

Répondre

1

Il semble comme ce que vous cherchez est un Django Formset, qui vous permet de modifier un modèle avec un ou plusieurs modèles connexes dans la même forme.

J'ai eu un certain succès en utilisant le CreateWithInlinesView et UpdateWithInlinesView fournies par django-extra-views pour faire un formsets litt le plus facile à gérer.

Si le formulaire nécessite beaucoup de logique personnalisée, rien ne vous empêche d'ajouter tous ces champs à un formulaire personnalisé, puis d'écrire une logique personnalisée dans la méthode de FormView. La bonne chose à propos de Django est que vous pouvez utiliser ses classes auxiliaires quand vous le pouvez, mais vous pouvez toujours gérer les choses manuellement si vous avez besoin d'une solution plus personnalisée.

+0

Je lis les documents sur formset maintenant - et je pense que c'est peut-être juste ce que le docteur a commandé. Essayer maintenant de voir ce que je peux arriver avec! Si cela fonctionne, ce sera un régal! – Hanny

+0

@Hanny Formsets prend un peu de pratique, mais ils sont vraiment pratiques une fois que vous vous y êtes habitué. Bonne chance! – Franey

+0

Cela a bien fonctionné. En fait, j'ai trouvé modelformset_factory juste ce que je cherchais! – Hanny