Прежде всего, мои извинения, если мои вопросы слишком очевидны или если это обсуждалось в другой теме.Я почти неделю работал над этим вопросом и безуспешно искал похожие темы.Я не профессиональный программист, но мне нравится создавать некоторые полезные части программного обеспечения.
Так что я программирую веб-приложение для контроля над веществами в моей лаборатории.Я установил одну модель для вещества (которая берет имя от другой модели, называемой 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 ...