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