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
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
@Hanny Formsets prend un peu de pratique, mais ils sont vraiment pratiques une fois que vous vous y êtes habitué. Bonne chance! – Franey
Cela a bien fonctionné. En fait, j'ai trouvé modelformset_factory juste ce que je cherchais! – Hanny