2014-06-30 2 views
2

J'essaie d'utiliser les formulaires ModelForm et inline de Django dans mes modèles. Cependant, je ne trouve aucune documentation qui correspond parfaitement à un modèle de base de données avec plusieurs clés étrangères dans la même table. Ce sont mes modèles:Formulaires en ligne Django avec plusieurs clés étrangères

# models.py 

class Universities(models.Model): 
    name = models.CharField(max_length=100) 

class Majors(models.Model): 
    name = models.CharField(max_length=80) 

class Resumes(models.Model): 
    name = models.CharField(max_length=70) 
    undergrad = models.ForeignKey(Universities, related_name='undergrad_university') 
    undergrad_major = models.ForeignKey(Majors, related_name='undergrad_major') 
    grad = models.ForeignKey(Universities, related_name='grad_university') 
    grad_major = models.ForeignKey(Majors, related_name='grad_major') 

Comment puis-je avoir Django générer un formulaire pour l'envoi des CV où les utilisateurs peuvent taper dans leur nom de l'université et les grands? Tous les quatre seraient utilisés pour créer de nouvelles entrées dans leurs bases de données respectives (2 dans les universités, 2 dans les majeures) avant d'enregistrer le nouveau CV similaire à la façon dont le inline formset example fonctionne pour une clé étrangère singulière.

Répondre

0

EDIT2: Pour faire une forme. Je suppose que je l'aurais fait une forme personnalisée avec méthode primordiale de sauvegarde(), quelque chose comme ça (forms.py):

class YourForm(forms.Form): 
    fname = forms.CharField(label="name",max_length=70,validators=[#Choose your validators here]) 
    fundergrad = forms.CharField(label="fundergrad",max_length=100,validators=[#Choose your validators here]) 
    fundergrad_major = forms.CharField(label="fundergrad_major",max_length=80,validators=[#Choose your validators here]) 
    fgrad = forms.CharField(label="fgrad",max_length=100,validators=[#Choose your validators here]) 
    fgrad_major = forms.CharField(label="fgrad_major",max_length=80,validators=[#Choose your validators here]) 

    def save(self, datas): 
     res = Resumes() 
     res.name = datas['fname'] 

     undergrad = Universities() 
     undergrad_major = Majors() 
     grad = Universities() 
     grad_major = Majors() 

     undergrad.name = datas['fundergrad'] 
     undegrad_major.name = datas['fundergrad_major'] 
     grad.name = datas['fgrad'] 
     grad_major.name = datas['fgrad_major'] 

     undergrad.save() 
     undergrad_major.save() 
     grad.save() 
     grad_major.save() 

     res.undergrad = undergrad 
     res.undergrad_major = undergrad_major 
     res.grad = grad 
     res.grad_major = grad_major 

     res.save() 
     return res 

En views.py:

def formView(request) : 
    if request.method == 'POST': 
     form = YourForm(request.POST) 
     if form.is_valid(): 
      datas={} 
      datas['fundergrad']=form.cleaned_data['fundergrad'] 
      datas['fundergrad_major']=form.cleaned_data['fundergrad_major'] 
      datas['fgrad']=form.cleaned_data['fgrad'] 
      datas['fgrad_major']=form.cleaned_data['fgrad_major'] 

      form.save(datas) 

    #Then do what you have to do in your view 

EDIT1: (doesn « t réponse à la question, mais il pourrait aider quelqu'un peut-être si je laisse ici)

j'aurais essayé quelque chose comme ça dans admin.py:

class UniversitiesInline1(admin.StackedInline): 
    model:Universities 
    fk_name = "undergrad" 

class UniversitiesInline2(admin.StackedInline): 
    model = Universities 
    fk_name = "grad" 

class MajorsInline1(admin.StackedInline): 
    model = Majors 
    fk_name = "undergrad_major" 

class MajorsInline2(admin.StackedInline): 
    model = Majors 
    fk_name = "grad_major" 

class ResumesAdmin(admin.ModelAdmin) 
    inlines = [ 
    UniversitiesInline1, 
    UniversitiesInline2, 
    MajorsInline1, 
    MajorsInline2, 
    ] 

admin.site.register(Resumes, ResumesAdmin) 

Explications: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model

+0

Ah J'avais peur qu'un formulaire personnalisé avec une sauvegarde personnalisée soit la seule solution (je commençais à descendre le même chemin avant de poster ma question). La description des formulaires en ligne ModelForms + semblait parfaitement correspondre, mais je suppose que ce n'est pas possible avec mon modèle. Je vais laisser tomber la question pour un autre jour ou deux et j'espère que ce n'est pas le cas avant d'accepter. Je vais également tester le code et vous faire savoir si cela fonctionne. Merci. –

+0

En fait, un formulaire personnalisé vous laissera toujours plus de liberté pour: style d'affichage, type de champs, widget de champs, validateurs et valideurs personnalisés, validation complexe (si vous voulez vérifier les champs entre eux par exemple). Vous pouvez le faire très facilement sous une forme personnalisée, un simple formulaire Django ne permet pas beaucoup de personnalisation. –

+0

Cela ne s'applique pas lorsque le modèle ne parvient pas à enregistrer lorsque les données d'entrée utilisateur ne sont pas validées correctement – Jay

Questions connexes