Question ModelForm

a marqué ce sujet comme résolu.

Bonjours à tous, J'ai un soucie avec un ModelForm que je souhaites créer a partir d'une de mes table, j'arrive à créer un formulaire à partir d'un modéle tout simple c'est à dire juste le modéle avec ses attributs, mais avec mon modéle qui hérite de class abstraite qui possèdent des clés étrangére, je n'y arrive pas je sais pas du tout si le problème viens de la et si oui comment le régler… :/ si quel qu'un pourrait m'expliquer ça serait cool :) .

voici mes modéle ( je veut faire le formulaire du modele Experiment ) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from django.db import models

# Create your models here.
class Optics(models.Model):
    optics = models.CharField(max_length = 50)
    def __str__(self):
        return self.optics

class Sixc(models.Model):
    sixc = models.CharField(max_length = 50)
    def __str__(self):
        return self.sixc

class Kb(models.Model):
    kb = models.CharField(max_length = 50)
    def __str__(self):
        return self.kb

class Other(models.Model):
    other = models.CharField(max_length = 50)
    def __str__(self):
        return self.other

class Comment(models.Model):

    experimental_hutch = models.CharField(max_length = 50)
    sample_holder = models.CharField(max_length = 50)
    evaporator = models.CharField(max_length = 50)
    t_range = models.CharField(max_length = 50)
    gasses = models.CharField(max_length = 50)
    type_of_sample = models.CharField(max_length = 50)

    class Meta:
        abstract = True

class Specfiles(models.Model):

    sixc = models.ManyToManyField(Sixc)
    optics = models.ManyToManyField(Optics)
    kb = models.ManyToManyField(Kb)
    other = models.ManyToManyField(Other)

    class Meta:
        abstract = True

class Experiment(Comment,Specfiles):
    experiment_id = models.CharField(max_length = 50, primary_key=True)
    name_proposer = models.CharField(max_length = 50)
    proposal = models.CharField(max_length = 300)
    folder = models.CharField(max_length = 300)
    image_folder = models.CharField(max_length = 300)
    date = models.DateField(auto_now = False, auto_now_add = False)


    def __str__(self):
        return self.experiment_id

Bonjour,

Je débute sur Django et ton problème m'intéresse.

Est-ce réellement pertinent de faire hériter ta classe Experiment de Comment et SpecFiles ? Je veux dire, est-ce que cette classe sera prise en compte lorsque tu appliqueras une migration de ta base de données ?

Peut-être devrais-tu songer à redéfinir ton modèle ? Tu avais forcément au moins une raison de créer cette classe Experiment, peux-tu nous préciser ton choix à ce niveau-là ?

Et bien je débutes en Django aussi, donc je ne suis pas sûr que mon choix soit le plus efficace donc peut être que redéfinir mon modèle est une solution à mon problème ,mais j'ai fais cela car Comment , SpecFiles et Experiment sont 3 choses différentes qui forme un "tout" donc c'est pour cela que j'ai procédé de la sorte, sachant que Experiment peut avoir plusieurs SpecFiles j'ai créer des class dédiées pour que les attributs de SpecFiles puisse contenir plusieurs valeurs.

Après au niveau de la migration, je n'ai eu aucun soucie j'ai bien ma base avec la table Experiment qui contient les attributs de SpecFiles et Comment , j'ai même fais une barre de recherche qui fonctionne très bien avec cette base de donnés. Pour le moment il n'y a qu'avec le ModelForm que je rencontre un problème.

j'ai bien ma base avec la table Experiment qui contient les attributs de SpecFiles et Comment

Cela voudrait dire que tu as une redondance de données ?

J'ai du mal à comprendre où tu veux en venir avec tes explications. Est-ce que tu pourrais nous faire un schéma ?

Euh non il n'y a pas de redondance ,je vais citer la doc de Django, car je ne sais pas comment te l'expliquer clairement avec mes mot ^^

Classes de base abstraites¶

Les classes de base abstraites sont utiles lorsque vous souhaitez regrouper certaines informations communes à un ensemble de modèles. Vous rédigez la classe de base et indiquez abstract=True dans sa classe Meta. Aucune table de base de données ne sera créée pour ce modèle. Par contre, lorsqu’elle sera utilisée comme classe de base pour d’autres modèles, ses champs seront ajoutés à ceux de la classe enfant. Il est considéré comme une erreur que d’avoir des champs de la classe de base abstraite ayant le même nom que ceux de la classe enfant (et Django lèvera une exception).

et voila un schéma si ça peut permettre de mieux comprendre( je suis pas sûr que ce soit juste d'utiliser l’héritage dans le mcd mais bon je voyais pas trop comment l'imagé ^^ mais bon dans mon code c'est bien Experiment qui hérite de SpecFiles et Comment ) :

Image utilisateur

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte