【问题标题】:How do you modify form data before saving it while using Django's CreateView?在使用 Django 的 CreateView 时如何在保存表单数据之前对其进行修改?
【发布时间】:2018-12-12 11:33:00
【问题描述】:

我正在使用 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()

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        def form_valid(self, form):
            self.object = form.save(commit=False)
            # ...
            self.object.save()
        
            return http.HttpResponseRedirect(self.get_success_url())
        

        【讨论】:

          【解决方案4】:

          仅供参考

          第一种情况

          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
          

          【讨论】:

            猜你喜欢
            • 2023-01-01
            • 2022-01-22
            • 2012-09-09
            • 2014-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-05
            相关资源
            最近更新 更多