1
class Biochemical_analysis_of_blood(CreateView): 
    model = BiochemicalAnalysisOfBlood 
    form_class = BiochemicalAnalysisOfBloodForm 
    template_name = "biochemical_analysis_of_blood.html" 
    success_url = reverse_lazy("patients") 

    def get_context_data(self, **kwargs): 
     context = super(Biochemical_analysis_of_blood, self).get_context_data(**kwargs) 
     patient = Patient.objects.get(id=1) 
     context["patient"] = patient 
     return context 

    def post(self, request, *args, **kwargs): 
     analysis = Analyzes() 
     sid = transaction.savepoint() 
     analysis.name = request.POST["name"] 
     analysis.patient_id = Patient.objects.get(id=1) 
     analysis.who_send = request.POST["who_send"] 
     analysis.who_is_doctor = request.POST["who_is_doctor"] 
     analysis.lab_user_id = Doctor.objects.get(id=request.POST["lab_user_id"]) 
     analysis.additional_lab_user = request.POST["lab_user_add"] 
     analysis.date = '2017-06-18' 
     analysis.type = 3 
     analysis.date_analysis = '2017-06-18' 
     analysis.save() 
     return super(Biochemical_analysis_of_blood, self).post(request, *args, **kwargs) 

j'ai algorithme suivant:quelques problèmes avec CreateView dans le Django

  1. Render BiochemicalAnalysisOfBloodForm à l'utilisateur

  2. Quand il remplit les champs et appuie sur le bouton « Enregistrer » Je crée une nouvelle instance de Analyzes() et le remplir par programme et quand dans la méthode de poste, j'appelle super().post() puis les données des utilisateurs seront écrites sur le modèle BiochemicalAnalysisOfBlood automatiquement? Mais j'ai erreur suivante:

NOT NULL constraint failed: laboratory_biochemicalanalysisofblood.analysis_id

Comment puis-je en mode manuel ajouter au modèle dans le champ « analyse » au début créé instance de Analyzes()? Je ne comprends pas cette classe à la fin où je peux trouver des informations sur toutes ses possibilités

+0

Pouvez-vous poster le contenu de votre formulaire BiochemicalAnalysisOfBloodForm? – SebCorbin

+0

Pourquoi ne pas avoir un ID autofilled séparé et avoir un ID d'analyse? – mikep

Répondre

1

La partie principale de votre algorithme doit résider dans votre formulaire, parce que vous voulez passer le analysis_id à l'instance d'être sauvé

class BiochemicalAnalysisOfBloodForm(ModelForm): 
    def save(self, commit=True): 
     analysis = Analyzes() 
     sid = transaction.savepoint() 
     analysis.name = self.data["name"] 
     analysis.patient_id = Patient.objects.get(id=1) 
     analysis.who_send = self.data["who_send"] 
     analysis.who_is_doctor = self.data["who_is_doctor"] 
     analysis.lab_user_id = Doctor.objects.get(id=self.data["lab_user_id"]) 
     analysis.additional_lab_user = self.data["lab_user_add"] 
     analysis.date = '2017-06-18' 
     analysis.type = 3 
     analysis.date_analysis = '2017-06-18' 
     analysis.save() 
     # Your analysis is created, attach it to the form instance object 
     self.instance.analysis_id = analysis.id 
     return super().save(commit) 
0

Avant de faire le super() poste, vous pouvez modifier les données de request.POST d'inclure votre identifiant d'analyse.

request.POST['analysis_id'] = analysis.id 

qui pourrait aider.

Notez également que si la validation de formulaire échoue dans super(). Post, vous aurez quand même créé un objet Analysis qui pourrait ne pas être utile. Vous pouvez utiliser surcharger la méthode form_invalid de CreateView pour gérer cela.

+0

Je l'ai fait et ai l'erreur suivante "Cette instance de QueryDict est immutable" et puis j'ajoute le code suivant "si pas request.POST._mutable: request.POST._mutable = Vrai" et encore cette erreur "contrainte non NULL a échoué: laboratory_biochemicalanalysisofblood.analysis_id " @Lucas Moeskops –

+0

Ah, oui c'est un peu plus compliqué. request.POST ne devrait idéalement pas être édité, et vous pouvez modifier les paramètres qui sont envoyés au formulaire en remplaçant la méthode 'get_form_kwargs' sur le CreateView. Ensuite, vous devrez créer un dictionnaire personnalisé contenant request.POST et analysis_id. Ensuite, si l'analyse existe, cela devrait fonctionner. –