Некоторые проблемы с CreateView в 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)

У меня есть следующий алгоритм:

  1. оказывать BiochemicalAnalysisOfBloodForm пользователю

  2. Когда он заполняет поля и нажимает кнопку "Сохранить", я создаю новый экземпляр Analyzes() и заполняем его программно, а когда в методе post я вызываю super().post() тогда данные пользователей будут записаны в модель BiochemicalAnalysisOfBlood автоматически? Но у меня есть следующая ошибка:

Не выполнено ограничение NOT NULL: Laboratory_biochemicalanalysisofblood.analysis_id

Как в ручном режиме добавить к модели в поле "анализ" ранее созданный экземпляр Analyzes()? Я не понимаю этот класс до конца, где я могу найти информацию обо всех его возможностях

2 ответа

Решение

Основная часть вашего алгоритма должна находиться в вашей форме, потому что вы хотите передать analysis_id сохраняемому экземпляру.

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)

Перед выполнением super(). Post вы можете изменить данные request.POST, включив в них свой идентификатор анализа:

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

это может помочь.

Также обратите внимание, что если проверка формы не удалась в super(). Post, вы все равно создадите объект Analysis, который может оказаться бесполезным. Вы можете использовать переопределить метод form_invalid CreateView для обработки этого.

Другие вопросы по тегам