Django: запуск создания нового объекта при отправке формы CreateView - PullRequest
0 голосов
/ 02 марта 2019

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

Так что я программирую веб-приложение для контроля над веществами в моей лаборатории.Я установил одну модель для вещества (которая берет имя от другой модели, называемой SubstanceDict), другую для контроля качества и другую для статуса вещества, скажем:

class Substance(models.Model):
 reg_num = models.CharField(max_length=11, default=adding_reg_num, editable=False)
 name = models.ForeignKey(SubstanceDict, on_delete=models.CASCADE)
 provider = models.CharField(max_length=20)
 '''some other fields and functions in here...'''

@receiver(post_save, sender=Substance)
def set_to_quaratine(sender, **kwargs):
    if kwargs.get('created', False):
        SubstanceStatus.objects.get_or_create(origen=kwargs.get('instance'), status=0, comments="Set to quarantine whilst reception.")

class QualityControl(models.Model):
    qc_reg_num = models.CharField(max_length=12, default=adding_qc_reg_num, editable=False)
    source = models.ForeignKey(Substance, on_delete=models.CASCADE, related_name='quality_control')
    '''whatever else'''

class SubstanceStatus(models.Model):
    source = models.ForeignKey(SustanciaDetalle, on_delete=models.CASCADE, related_name='status')
    status = models.IntegerField(choices=(
        (0, 'Quarantine'),
        (1, 'Approved'),
        (2, 'Rejected'),), null = False)
    quality_control = models.ForeignKey(QualityControl, on_delete=models.CASCADE, blank=True, null=True)
    date = models.DateTimeField(auto_now_add=True)
    comments = models.TextField()

Итак, в основном, используя CreateViewдля Substance Model: всякий раз, когда я создаю новый экземпляр Substance, @receiver запускает создание экземпляра SubstanceStatus со статусом = 0 и комментарием, в котором указано «Установить на карантин во время приема».

После CreateView ofВещество, оно перенаправляет (метод GET с веществом reg_number) в новую форму, чтобы создать связанный экземпляр QualityControl.Все до здесь в порядке.Затем я использую три кнопки для метода POST: «Сохранить и одобрить», «Сохранить и сохранить на карантине» и «Сохранить и отклонить».И вот моя проблема.Мне бы хотелось, чтобы при нажатии «Сохранить и одобрить» из CreateView, связанного с QualityControl, новый экземпляр SubstanceStatus запускался бы с тем же источником, что и источник QualityControl CreateView, status = 1 и quality_control с только что сгенерированным QualityControl,и аналогично, статус = 2, если отклонено, и статус = 0, если хранится в карантине.Как я мог это сделать?Я попытался @receiver в файле моделей без успеха, так как он не будет обрабатывать запросы POST или Sessions.Также изменение функции form_valid () ничего не делает, даже ошибки.Виды следующие:

class SubstanceCreate(CreateView):
    model = Substance
    fields = '__all__'
    autocomplete_fields = ['name']
    def get_form(self, form_class=None):
        form = super(SubstanceCreate, self).get_form(form_class)
        ''' some widgets '''
        return form


    def form_valid(self, form):
        substance = form.save()
        if 'quarantine' in self.request.POST:
            return super(SubstanceCreate, self).form_valid(form)
        elif 'addcc' in self.request.POST:
            return redirect(reverse('create-quality-control') + '?source=' + str(substance.reg_num))
        else:
                return super(SubstanceCreate, self).form_valid(form)


class QualityControlCreate(CreateView):
      model = QualityControl

      def get_form(self, form_class=None):
          form = super(QualityControlCreate, self).get_form(form_class)
          initial = self.request.GET['source']
          initial = Susbtance.objects.get(reg_num=initial)
          form.instance.origen = initial
          return form


      def form_valid(self, form):
          y = super(QualityControlCreate, self).form_valid(form)
          if 'approve' in request.POST:
              request.session['status'] = 1

          source = "000001"
          source = Substance.objects.get(reg_num=source)
          status = SubstanceStatus(status=1, comments="")
          status.save(commit=false)
          status.source = source
          status.save()
          return y

РЕДАКТИРОВАТЬ:

Итак, я получил подход после прочтения Как передать kwargs из сохранения в сигнал post_save .

Дело в том, что я могу получить доступ к атрибутам из модели, которую я создаю на приемнике, и использовать getattr, но я все еще не могу передать переменные, принадлежащие модели, которую я хочу создать.Так что я могу передать Source и quality_control, но не статус и не комментарии ...

РЕДАКТИРОВАТЬ # 2:

Просто натыкаясь.Я не могу решить это.Может быть, пользовательские классы это сделают?Не уверен, как использовать их с CreateView ...

1 Ответ

0 голосов
/ 02 марта 2019

Попробуйте добавить это определение в ваши классы CreateView.В целях отладки удалите операторы print и верните ошибки формы в другое представление или CreateView в качестве контекста, чтобы предоставить пользователям обратную связь.

def form_invalid(self, form):
        print("form is invalid")
        print(form.errors)
        return http.HttpResponse("form is invalid.. this is just an HttpResponse object")

Надеюсь, это поможет!

...