Django : ModelForm et ForeignKey

Je suis en train de développer un système d’invitation et je me suis retrouvé devant un problème que je souhaitais résoudre le plus élégamment possible. Ai-je réussis ? À vous de me le dire 😉

L’explication en commentaire dans le code ci-dessous. Le code à été réduit au minimum pour se concentrer sur la partie Form

# Model
class Organisation(models.Model):
    name = models.CharField(max_length=255)
 
class Invite(models.Model):
    organisation = models.ForeignKey(Organisation)
    email = models.EmailField()
 
# Form
class InviteForm(ModelForm):
    def __init__(self, *args, **kwargs):
        # On passe la foreign_key en paramètre à partir de la view
        if kwargs.has_key('organisation'): self.organisation = kwargs.pop('organisation')
        super(InviteForm, self).__init__(*args, **kwargs)
 
    def save(self, commit=True):
        # On sauve sans faire la requête SQL (commit=False) pour
        # pouvoir ajouter à l'instance l'organisation
        super(InviteForm, self).save(commit=False)
        # On ajoute à l'instance la foreign_key
        self.instance.organisation = self.organisation
        # On peut maintenant sauver
        super(InviteForm, self).save(commit)
 
    class Meta:
        model = model.Invite
        fields = ['email']
 
# View
def invite_add(request, oid):
    organisation = models.Organisation.objects.get(pk=oid)
 
    if request.method == 'POST':
        # Dans la vue j'envoie la foreign_key
        form = forms.InviteForm(request.POST, organisation=organisation)
        if form.is_valid():
            form.save()

Pourquoi cela me parait élégant (ou du moins pas trop dégeulasse):

  • La logique reste dans le Form (et pas dans la view comme j’ai pus le voir sur internet)
  • On n’altère pas le fonctionnement de save(). Le paramètre commit reste fonctionnel

Je n’ai pas trouvé d’autres solutions élégante pour faire cela, si vous en avez une je la prends avec plaisir ;).

Aymeric DERBOIS

J'ai 27 ans et je suis développeur. Je travail la plupart du temps sur des techno web, mais pas que. Étant à l'affût des nouveautés, j'adore découvrir tout et n'importe quoi dans l'informatique. Je suis amoureux de CakePHP et j'utilise au quotidien Django. Je suis très ouvert d'esprit :). J'aime bien utiliser AngularJS aussi de temps à autre pour faire du front. Au quotidien j'utilise Fedora/Ubuntu pour le desktop et CentOS pour mes serveurs. Par ailleurs je maîtrise le C/C++/Python/PHP/...

More Posts - Website

Follow Me:
Twitter

Une réponse pour “Django : ModelForm et ForeignKey”

  1. Nicolas Dumoulin6 janvier 2016 à 15 h 35 minRépondre

    Solution élégante.
    Merci 🙂

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.