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
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. –
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
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. –