django FormView 在验证之前修改字段

问题描述 投票:0回答:1

在验证基于类的数据之前是否有正确的方法来修改表单字段

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',)

我在 DRF 视图集中使用 CreatedByMixin 作为 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 使用类似的 mixin,但我不确定覆盖的正确方法是什么。

此外,

HxFormValidationMixin
已经覆盖了
form_valid
form_invalid
方法。

django django-class-based-views formview
1个回答
0
投票

FormView
继承自
FormMixin
,它实现了方法
get_form_kwargs()
。 通过重写此方法,您可以在将
data
kwarg 传递给表单构造函数之前对其进行处理。

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
© www.soinside.com 2019 - 2024. All rights reserved.