2017-05-01 6 views
0

Mon problème est le suivant. Je sauvegarde des données pour les patients à partir d'un formulaire sur une page Web. Le formulaire est généré à partir des définitions de modèle dans models.py. L'information que je garde est nom, prénom parmi d'autres. J'ai un champ pour le diagnostic qui est sélectionné en utilisant un multichoiceField et je l'enregistre en utilisant manytomany.
Lorsque les données sont enregistrées, une table distincte est créée pour le diagnostic attribué à chaque patient comme prévu. Le tableau contient un diagnostic et l'ID du patient auquel il s'applique. Chaque diagnostic est enregistré dans un enregistrement séparé. En plus de sélectionner le diagnostic, j'enregistre également la date à laquelle le diagnostic est effectué. Vous verrez ce que je veux dire dans le code models.py et form.py ci-dessous.
Je voudrais avoir la date pour laquelle le diagnostic a été fait aussi enregistré dans le tableau mais je n'arrive pas à comprendre comment faire. J'ai essayé de suivre les docs: https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany ainsi que d'autres publications sur SO, mais je n'arrive pas à comprendre comment le faire. Je ne peux pas comprendre comment les vues, les formes et les modèles doivent être mis en place pour atteindre. Est-il possible de le faire et si oui comment? J'ai essayé d'utiliser un modèle intermédiaire avec manytomany et 'through', mais je ne le comprends pas. Toute l'aide pouvant etre apportée serait très appréciée.Django M2M avec des données supplémentaires avec

Voici une version simplifiée de mon code:

models.py:

class diagnosisChoices(models.Model): #This represents the list in the drop down menu for the different diagnosis. 
    diagnosis = models.CharField(max_length = 50) 
    def __str__(self):    
     return self.diagnosis 

class PatientData(models.Model): 
    Name = models.CharField(max_length=100) 
    Surname = models.CharField(max_length=100) 

    dateOfBirth = models.DateField(default = datetime.datetime.now()) 
    diagnosis = models.ManyToManyField(
     'diagnosisChoices', 
     #on_delete=models.CASCADE, 
    ) 

views.py:

def patientDataView(request): 
    uId = request.user.id 

    if request.method == "POST": 
    form = PatientDataForm(request.POST) 

    if form.is_valid(): 
     model_instance = form.save(commit=False) 
     model_instance.timestamp = timezone.now() 
     model_instance.save() 
     #model_instance.add(uId) 
     form.save_m2m()   
     return HttpResponseRedirect('/dataBase') 

    else: 

    form = PatientDataForm() 

    return render(request, "dataBaseTest.html", {'form': form}) 
    date_of_diagnosis = models.DateField(default=datetime.datetime.now()) 

forms.py

from django.forms import ModelForm 
from django import forms 
from .models import PatientData 
from .models import diagnosisChoices #This is the list of diagnosis in the dropdown 
from django.forms import extras 
import datetime 

from functools import partial 
class PatientDataForm(ModelForm): 
    class Meta: 
     now = datetime.datetime.now() 
     thisYear = now.year 
     DateInput = partial(forms.DateInput, {'class': 'datepicker'}) 
     widgets = { 
     } 

     model = PatientData 
     fields = ['Name', 
       'Surname', 
       'dateOfBirth', 
       'diagnosis', 
       'date_of_diagnosis', 
       ] 

Merci , Thomas

Répondre

0

La principale chose que vous n'obtenez pas est sur le models.py, donc je vais me concentrer dessus.

Vous avez besoin de trois tables pour faire ce que vous avez décrit: diagnosisData, PatientData et une table « d'adhésion » que j'appelle diagnosisPatient. Ensuite, vous construisez votre modèle comme celui-ci:

class diagnosisChoices(models.Model): 
    diagnosis = models.CharField(max_length = 50) 

class PatientData(models.Model): 
    Name = models.CharField(max_length=100) 
    Surname = models.CharField(max_length=100) 
    dateOfBirth = models.DateField(default = datetime.datetime.now()) 
    diagnosis = models.ManyToManyField('diagnosisChoices',through='diagnosisPatient') 

class diagnosisPatient(models.Model): 
    patient = models.ForeignKey('PatientData') 
    diagnosis = models.ForeignKey('diagnosisChoices') 
    dateOfDiagnosis = models.DateField() 

Une fois que vous avez votre modèle construit de cette façon, vous devez enregistrer vos instances PatientData et votre diagnosisChoices comme d'habitude. Pour la relation plusieurs à plusieurs, vous devez l'enregistrer manuellement sur la table diagnosisPatient en utilisant les clés étrangères appropriées et la date. Vous pouvez interroger la relation plusieurs à plusieurs du modèle PatientData comme d'habitude avec la fonction objects.all(). La chose ici à garder à l'esprit est que les relations ManyToMany dans django créent toujours une nouvelle table d'adhésion pour vous dans les coulisses. Ainsi, lorsque vous n'avez pas besoin d'insérer des informations supplémentaires sur la relation, la table diagnosisPatient est composée de deux clés étrangères et elle est masquée. L'argument à propos de cette relation ne fait que mettre cette table en lumière et vous donner le contrôle de mettre toute nouvelle relation que vous aimez.

+0

Merci Tico. Votre exemple de la façon de configurer le fichier models.py a beaucoup aidé. J'ai réussi à enregistrer le champ M2M avec la date d'aujourd'hui, pas une date entrée dans le formulaire. Existe-t-il un moyen pour que l'utilisateur entre une date dans le formulaire pour le champ dateOfDiagnosis afin que cela puisse être sauvegardé à côté du diagnostic. Idéalement, je veux seulement que cette date soit sauvegardée dans la table 'diagnosisPatient' et non dans la table 'patientData', mais c'est une bonne chose à avoir. –

+0

Ok, alors je dois vous dire quelque chose dont je ne suis pas particulièrement fier: je n'utilise pas et je n'ai aucune idée de comment utiliser django forms.py.Chaque fois que j'essayais, ça ne faisait pas ce que je voulais faire, comme le cas que tu as en ce moment ... Donc tout ce que je fais avec les formulaires est le javascript manuel et il n'est pas connecté avec les formulaires django. Bref, je n'ai aucune idée de la façon de plier les formes pour s'adapter à ce cas! Sry: | Un rapide google m'a eu à ce lien qui a l'air très utile: http://timlwhite.com/2012/07/21/django-many-to-many-model-saving-with-intermediary-through-model/ – Tico

+0

J'ai trouvé ce lien avant et joué avec, mais il semble y avoir beaucoup d'erreurs. Si je n'arrive pas à faire fonctionner mes modèles et formulaires comme je le veux, je pourrais créer des formulaires distincts qui devraient être atteints, mais cela deviendrait lourd. Dans ce cas, je vais devoir travailler sur la façon de faire référence entre les tables avec les clés d'identification. (Je suis nouveau à cela, donc cela prendra du temps). Merci encore pour l'aide cependant. –