繁体   English   中英

使用 Django 的 CreateView 如何在保存前修改表单数据?

[英]How do you modify form data before saving it while using Django's CreateView?

我正在使用 Django 的CreateView ,我正在尝试找出如何修改在保存之前发送的任何文本。 例如,现在我只想在保存前将所有文本小写。

我知道我需要使用form_valid()但我似乎无法正确使用它。

表单.py

class ConfigForm(forms.ModelForm):
    class Meta:
        model  = Config
        fields = ["heading", "name", "data", "rating"]

视图.py

def form_valid(self, form):
    super().form_valid(form)
    form.fields["heading"].lower()
    form.fields["name"].lower()
    form.fields["data"].lower()

这不应该在 form_valid 中完成。 您应该在表格本身中这样做。 不要让 CreateView 自动为您创建表单,而是显式地执行并覆盖clean方法。

class MyForm(forms.ModelForm):
   class Meta:
      model = MyModel
      fields = ('list', 'of', 'fields')

   def clean(self):
       for field, value in self.cleaned_data.items():
           self.cleaned_data['field'] = value.lower()

...

class MyCreateView(views.CreateView):
    form_class = MyForm

覆盖get_form_kwargs方法来更新实例化表单的kwargs

解决方案

def get_form_kwargs(self):
    # update super call if python < 3
    form_kwargs = super().get_form_kwargs()
    form_kwargs['data']['str_field_name'] = form_kwargs['data']['str_field_name'].lower()

    return form_kwargs

参考get_form_kwargs 文档

虽然它可能不是最好的解决方案,但可以这样做:

def form_valid(self, form):
    self.object = form.save(commit=False)
    # ...
    self.object.save()

    return http.HttpResponseRedirect(self.get_success_url())

仅供记录

在第一种情况下

def get_form_kwargs(self):
    # update super call if python < 3
    form_kwargs = super().get_form_kwargs()
    form_kwargs['data']['str_field_name'] = form_kwargs['data'['str_field_name'].lower()
    return form_kwargs

Django 抱怨“这个 QueryDict 实例是不可变的”。 解决方法是

 data = kwargs['data'].copy() # mutable copy
 data['foo'] = 'whatever' #supply the missing default value
 kwargs['data'] = data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM