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

Upvotes: 1

Views: 197

Answers (2)

SebCorbin
SebCorbin

Reputation: 1733

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)

Upvotes: 1

Lucas Moeskops
Lucas Moeskops

Reputation: 5443

Before doing the super().post you can modify the request.POST data to include your analysis id:

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

that might help.

Also note that if the form validation fails in super().post, you will still have created an Analysis object which might not be useful. You could use override the form_invalid method of the CreateView to handle this.

Upvotes: 0

Related Questions