Search code examples
pythondjangodjango-generic-viewsdjango-class-based-views

some troubles with CreateView in the Django


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)

I have next algorithm:

  1. Render BiochemicalAnalysisOfBloodForm to the user

  2. When he fills fields and presses button "save" I create a new instance of Analyzes() and fill it programmatically and when in the post method I call super().post() then users data will be written to the model BiochemicalAnalysisOfBlood automatically? But I have next error:

NOT NULL constraint failed: laboratory_biochemicalanalysisofblood.analysis_id

How can I in hand mode add to the model to the field "analysis" the early created instance of Analyzes()? I don't understand this class to the end where I can find information about all it's opportunities


Solution

  • The main part of your algorithm should reside in your form, because you want to pass the analysis_id to the instance being saved

    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)