Возможно я принципиально что-то не так реализую.
Задача: Есть инструмент. Есть его перемещения между контрагентами. Надо сделать проверку, что дата перемещения не ранее даты последнего перемещения.
class Tool(models.Model):
name = models.CharField(max_length=128, blank=False)
code_number = models.CharField(max_length=8, blank=True, null=True, unique=True)
buy_date = models.DateField(blank=True, null=True)
comment = models.TextField(blank=True)
class ToolMove(models.Model):
tool = models.ForeignKey(Tool, on_delete=models.CASCADE)
date = models.DateField(blank=True)
to_supplier = models.ForeignKey(Supplier, related_name='to_supplier', on_delete=models.PROTECT)
comment = models.TextField(blank=True)
Добавление перемещения осуществляется из карточки инструмента (DetailView). Параметр запроса – tool_pk.
path('toolmove/<int:tool_pk>/create/', ToolMoveCreateView.as_view(), name='toolmove_create_url'),
Поскольку часть полей берется не из формы, создаю перемещение следующим образом (тут очень не уверен, что подход правильный, чмырение за кривой код и описание как сделать лучше приветствуется :):
def post(self, request, tool_pk):
tool = get_object_or_404(Tool, pk=tool_pk)
bound_form = self.form_name(request.POST)
if bound_form.is_valid():
toolmove = ToolMove()
toolmove.tool = tool
toolmove.date = bound_form.cleaned_data['date']
toolmove.to_supplier = bound_form.cleaned_data['to_supplier']
toolmove.comment = bound_form.cleaned_data['comment']
toolmove.save()
if self.redirect_url:
return redirect(self.redirect_url)
else:
return redirect(tool)
action_url = reverse(self.action_url, kwargs={'tool_pk': tool_pk})
record_name = self.record_name
context = {
'form': bound_form,
'action_url': action_url,
'record_name': record_name,
'tool': tool
}
return render(request, self.template, context=context)
Т.е. поскольку не все атрибуты вводятся в форме, делаю так. Тут можно наверное было tool засунуть в скрытое поле и взять все из формы, но бывает, что часть атрибутов получаю из БД или методом вычислений. Такой подход (когда не используешь form.save(), а создаешь объект и часть атрибутов берешь из формы, часть методом вычислений и из БД и сохраняешь) имеет право на жизнь или надо как-то по-другому?
Создаю метод для проверки даты:
def clean_date(self):
new_date = self.cleaned_data['date']
last_date = ToolMove.objects.filter(tool=???).last()
if last_date.date > new_date:
raise ValidationError('Дата перемещения не может быть раньше последнего перемещения')
return new_date
И тут чтобы получить последнюю дату для инструмента, мне нужен pk инструмента, который передается в GET.