2010-03-23 6 views
3

J'ai deux modèles:forme Django reliant 2 modèles par beaucoup de nombreux champs

class Actor(models.Model): 
    name = models.CharField(max_length=30, unique = True) 
    event = models.ManyToManyField(Event, blank=True, null=True) 

class Event(models.Model): 
    name = models.CharField(max_length=30, unique = True) 
    long_description = models.TextField(blank=True, null=True) 

Je veux créer une forme qui me permet d'identifier le lien entre les deux modèles quand j'ajoute une nouvelle entrée. Cela fonctionne:

class ActorForm(forms.ModelForm): 
    class Meta: 
      model = Actor 

Le formulaire comprend le nom et l'événement, me permettant de créer un nouvel acteur et un lien simultané à un événement existant.

Sur l'autre face,

class EventForm(forms.ModelForm): 
    class Meta: 
      model = Event 

Ce formulaire ne comprend pas une association d'acteurs. Donc, je suis seulement capable de créer un nouvel événement. Je ne peux pas le lier simultanément à un acteur existant.

J'ai essayé de créer un formset en ligne:

EventFormSet = forms.models.inlineformset_factory(Event, 
     Actor, 
     can_delete = False, 
     extra = 2, 
     form = ActorForm) 

mais je reçois une erreur

<'class ctg.dtb.models.Actor'> has no ForeignKey to <'class ctg.dtb.models.Event'> 

Ce n'est pas trop surprenant. Le jeu en ligne a fonctionné pour un autre ensemble de modèles que j'avais, mais c'est un exemple différent. Je pense que je vais tout à fait faux.

Question générale: Comment puis-je créer un formulaire qui me permet de créer un nouvel événement et le lier à un acteur existant?

+0

Combien de «Acteurs» sont impliqués dans un 'Event'? De mon sentiment, je créerais une clé étrangère de 'Event' à' Actor' en premier lieu. –

+1

Je comprends votre point de vue, mais je pense que Many to Many est correct. Plus d'un acteur peut assister à un événement, et un acteur peut assister à plusieurs événements. –

Répondre

1

Personnellement, je mettrais l'ManyToMany sur l'événement pour commencer, mais chacun leur propre ...

Quant à la façon de le faire, vous voulez écrire un ModelForm personnalisé (pas un formset en ligne), appelons-le EventForm. Il gérerait tous les champs de votre événement et aurait également un ModelChoiceField ou ModelMultipleChoiceField pour permettre la sélection de l'acteur (s) impliqués. Ensuite, à votre avis, vous diviser le traitement des champs Event et le champ ForeignKey/M2M.

Avez-vous du sens? alt text http://sonicloft.net/im/52

Questions connexes