@G_r_i_n_v_i_c_h

Как получить get параметр в _clean методе формы?

Возможно я принципиально что-то не так реализую.
Задача: Есть инструмент. Есть его перемещения между контрагентами. Надо сделать проверку, что дата перемещения не ранее даты последнего перемещения.

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.
  • Вопрос задан
  • 18 просмотров
Пригласить эксперта
Ответы на вопрос 1
@G_r_i_n_v_i_c_h Автор вопроса
Как вариант еще запихать tool_pk в bound_form перед вызовом is_valid(), но вариант кажется ужасным.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы