【问题标题】:Python edit form data prior to django validationPython 在 Django 验证之前编辑表单数据
【发布时间】:2016-11-01 18:12:33
【问题描述】:

我对 python 还很陌生,并且一直在寻找如何在所有标准 python 表单/字段验证器发挥作用之前编辑表单数据。

我有一个带有 IntegerField 的模型表单,我想从中删除“$”和逗号(使用某种自定义验证),然后让普通的 to_python() validate() 等做他们的事情。

我的代码如下 - 任何帮助将不胜感激!

forms.py

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)

【问题讨论】:

  • 如果您在整数字符串中传递 $ 和逗号,您将在 IntegerFieldto_python 方法上失败。
  • 是的,我知道它失败了。这就是为什么我想在它转到 to_python 之前删除它们。有什么想法吗?

标签: python django forms validation django-forms


【解决方案1】:

如果您已经超载get_form_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

【讨论】:

  • 嗨,我实际上已经尝试过了,但问题是,kwargs 是不可变的,所以我无法在 get_form_kwargs 方法中更改它。然后我尝试制作 kwargs 的可变副本并返回副本,但努力让它工作......?有什么想法吗?
  • @PhillipWatts 你用deepcopy复制了吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2011-10-22
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多