Django FormView изменяет поля перед валидацией

Существует ли правильный способ модификации полей формы перед проверкой данных на основе класса FormView. Более конкретно CreateView. Необходимо ли использовать представления на основе классов, потому что я собираюсь добавить кучу пользовательских миксинов:

class Create(HtmxRequiredMixin, CreatedByMixin, HxFormValidationMixin, BaseMixin, CreateView):
    template_name = 'administration/form.html'
    model = Object
    form_class = Form
    success_url = reverse_lazy('object-list')
    hx_retarget = '#CREATE'
    base = 'object'
    views_list = ('create',)

Я использовал CreatedByMixin в наборе представлений DRF для остального api. Это выглядит так:

class CreatedByMixin:
    def create(self, request, *args, **kwargs):
        data = request.data.copy()
        if request.user.is_authenticated:
            data['created_by'] = request.user.id
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Мне нужен подобный миксин для моего CreateView, но я не уверен, какой метод следует переопределить.

Кроме того, HxFormValidationMixin уже переопределяет методы form_valid и form_invalid.

FormView наследует от FormMixin, который реализует метод get_form_kwargs(). Переопределив этот метод, вы можете изменять кванг data до того, как он будет передан конструктору формы.

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()

    if 'data' in kwargs:
       data = kwargs['data'].copy()

       # change whatever you want
       data['foo'] = 'bar'

       # replace the original with the copy
       kwargs['data'] = data

    return kwargs

Фактическая реализация def get_form_kwargs(self): в FormMixin, которые наследуются от ContextMixin. Вы можете получить доступ к запросу, используя self.request, и когда у вас есть self.request, вы можете делать все, что хотите.

def get_form_kwargs(self):
    """Return the keyword arguments for instantiating the form."""
    kwargs = {
        "initial": self.get_initial(),
        "prefix": self.get_prefix(),
    }

    if self.request.method in ("POST", "PUT"):
        kwargs.update(
            {
                "data": self.request.POST,
                "files": self.request.FILES,
            }
        )
    return kwargs 
Вернуться на верх