使用 Django 的 CreateView 如何在保存前修改表单数据?
How do you modify form data before saving it while using Django's CreateView?
我正在使用 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()
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
虽然这可能不是最好的解决方案,但可以这样做:
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
我正在使用 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()
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
虽然这可能不是最好的解决方案,但可以这样做:
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