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

时间:2018-12-12 11:33:00

标签: python django django-class-based-views

我正在使用Django的CreateView,并且试图找出如何在保存之前修改发送的任何文本的方法。例如,现在我只希望在保存之前将所有文本都小写。

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

forms.py

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

views.py

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

3 个答案:

答案 0 :(得分:3)

这不应该在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

答案 1 :(得分:1)

重写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 docs

答案 2 :(得分:0)

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

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

    return http.HttpResponseRedirect(self.get_success_url())