Python在django验证之前编辑表单数据
我对python相当陌生,一直在搜索如何在所有标准python表单/字段验证器发挥作用之前编辑表单数据 我有一个带有整数字段的模型表单,我想从中删除“$”和逗号(使用某种自定义验证),然后让普通的to_python()validate()等来完成它们的工作 我的代码如下-任何帮助都将不胜感激 forms.pyPython在django验证之前编辑表单数据,python,django,forms,validation,django-forms,Python,Django,Forms,Validation,Django Forms,我对python相当陌生,一直在搜索如何在所有标准python表单/字段验证器发挥作用之前编辑表单数据 我有一个带有整数字段的模型表单,我想从中删除“$”和逗号(使用某种自定义验证),然后让普通的to_python()validate()等来完成它们的工作 我的代码如下-任何帮助都将不胜感激 forms.py class BuyerSettingsForm(forms.ModelForm): total_offer_limit = forms.IntegerField(required=
class BuyerSettingsForm(forms.ModelForm):
total_offer_limit = forms.IntegerField(required=False, max_value=10000000, min_value=0)
def __init__(self, request, *args, **kwargs):
super(BuyerSettingsForm, self).__init__(*args, **kwargs)
class Meta:
model = Buyer
fields = ['total_offer_limit']
def save(self, commit=True):
profile = super(BuyerSettingsForm, self).save(commit=commit)
profile.total_offer_limit = self.cleaned_data['total_offer_limit']
profile.save()
return profile
views.py
class SettingsPreferences(LoginRequiredMixin, BuyerAccessRequiredMixin, BuyerAdminAccessRequiredMixin, UpdateView):
template_name = 'invoicely/buyer/settings/buyer_settings.html'
form_class = BuyerSettingsForm
success_url = reverse_lazy('settings_preferences')
def get_object(self, *args, **kwargs):
return self.request.user.profile.buyer
def get_initial(self):
ctx = super(SettingsPreferences, self).get_initial()
ctx.update({
'total_offer_limit': self.object.total_offer_limit,
})
return ctx
def get_form_kwargs(self):
kwargs = super(SettingsPreferences, self).get_form_kwargs()
kwargs['request'] = self.request
return kwargs
def form_valid(self, form):
self.object = form.save()
messages.add_message(self.request, messages.SUCCESS, "Settings successfully updated")
return super(SettingsPreferences, self).form_valid(form)
如果您已经超载
get\u form\u kwargs
,您可以这样做。这是表单初始化时使用的数据。因此,我们可以在初始化之前对其进行编辑
class SettingsPreferences(LoginRequiredMixin, BuyerAccessRequiredMixin, BuyerAdminAccessRequiredMixin, UpdateView):
...
def get_form_kwargs(self):
kwargs = super(SettingsPreferences, self).get_form_kwargs()
kwargs = copy.deepcopy(kwargs)
kwargs['request'] = self.request
if self.request.method in ('POST', 'PUT'):
# here put your data editing code
kwargs['data']['total_offer_limit'] = int(kwargs['data']['total_offer_limit'].strip().replace('$', ''))
return kwargs
如果您已经超载
get\u form\u kwargs
,您可以这样做。这是表单初始化时使用的数据。因此,我们可以在初始化之前对其进行编辑
class SettingsPreferences(LoginRequiredMixin, BuyerAccessRequiredMixin, BuyerAdminAccessRequiredMixin, UpdateView):
...
def get_form_kwargs(self):
kwargs = super(SettingsPreferences, self).get_form_kwargs()
kwargs = copy.deepcopy(kwargs)
kwargs['request'] = self.request
if self.request.method in ('POST', 'PUT'):
# here put your data editing code
kwargs['data']['total_offer_limit'] = int(kwargs['data']['total_offer_limit'].strip().replace('$', ''))
return kwargs
如果您在整数字符串中传递
$
和逗号,则到IntegerField
的python
方法将失败。是的,我知道它失败了。这就是为什么我想在进入python之前删除它们。有什么想法吗?如果您在整数字符串中传递$
和逗号,您将在到IntegerField
的python
方法时失败。是的,我知道它失败了。这就是为什么我想在进入python之前删除它们。有什么想法吗?嗨,我实际上已经试过了,但问题是,kwargs是不可变的,所以我不能在get_form_kwargs方法中更改它。然后我试图制作一个kwargs的可变副本并返回副本,但很难让它正常工作。。。?有什么想法吗?@PhillipWatts你用deepcopy
复制了吗?嗨,实际上我已经试过了,但问题是,kwargs是不可变的,所以我不能在get\u form\u kwargs方法中更改它。然后我试图制作一个kwargs的可变副本并返回副本,但很难让它正常工作。。。?有什么想法吗?@PhillipWatts你用deepcopy
复制了吗?