[英]Convert all CharField Form Field inputs to lowercase in Django forms
我正在使用 Django 表单进行用户注册,用户可以在其中输入优惠券代码。 我希望在优惠券代码字段中输入的所有字符都转换为小写。 我已经尝试在 save 方法、自定义清理方法和自定义验证器中使用 .lower() ,但我对这些方法没有运气。 下面是我的代码。
class StripeSubscriptionSignupForm(forms.Form):
coupon = forms.CharField(max_length=30,
required=False,
validators=[validate_coupon],
label=mark_safe("<p class='signup_label'>Promo Code</p>")
def save(self, user):
try:
customer, created = Customer.get_or_create(user)
customer.update_card(self.cleaned_data["stripe_token"])
customer.subscribe(self.cleaned_data["plan"], self.cleaned_data["coupon"].lower())
except stripe.StripeError as e:
# handle error here
raise e
如上所述,我也尝试了一种清洁方法,但这也不起作用:
def clean_coupon(self):
return self.cleaned_data['coupon'].lower()
尝试在表单中使用带有小部件的 css 文本转换,如下所示:
class StripeSubscriptionSignupForm(forms.Form):
coupon = forms.CharField(max_length=30,
required=False,
validators=[validate_coupon],
label=mark_safe("<p class='signup_label'>Promo Code</p>")
widget=TextInput(attrs={'style': 'text-transform:lowercase;'})
)
解决方案是创建一个自定义表单字段,它允许您覆盖 to_python 方法,然后可以修改表单字段中的原始值。
class CouponField(forms.CharField):
def to_python(self, value):
return value.lower()
class StripeSubscriptionSignupForm(forms.Form):
coupon = CouponField(max_length=30,
required=False,
validators=[validate_coupon],
label=mark_safe("<p class='signup_label'>Promo Code</p>")
)
在确保用户模型中的电子邮件字段仅保存为小写时,我自己遇到了这个问题。 我在下面概述的方法的优点是您可以控制表单中每个字段的格式 - 与上面选择的答案相反,无论您是否愿意,都会将所有字段转换为小写。
对我来说,我相信上面的 OP 的问题是,清理后的值现在确实是小写的,但是 HTML 页面(验证和清理后呈现的页面)显示了预清理的值(即仍然是大写),这会让用户感到困惑。 发生的事情是表单字段值仍然是初始数据,即 X@Y.com 并且清理后的数据实际上是 x@y.com 。
处理提交的表单后:
>>>user_form.cleaned_data['email']
'x@y.com'
和
>>>user_form['email'].value()
'X@Y.com'
该模板使用 user_form['email'].value() 而不是 user_form.cleaned_data['email'] 提供的值,因此用户认为他的电子邮件已保存为大写形式,而实际上它已保存为小写形式.
在这种情况下,将 user_form 返回给客户端的最简单方法是在保存后直接重新加载保存的表单。 按照以下两个示例(一个保存到数据库,一个不保存到数据库)。
表格.py
from django.contrib.auth.models import User
class UserForm(forms.ModelForm):
"""
UserForm is a simple form to allow a user to change his/her name and email.
"""
class Meta:
model = User
fields = ['first_name', 'last_name', 'email']
def clean_email(self):
"""
ensure that email is always lower case.
"""
return self.cleaned_data['email'].lower()
在views.py中
def post(self, request):
user_form = UserForm(request.POST, instance=request.user)
if user_form.is_valid():
user_form.save() # using the provided save from Modelform in this case
user_form = UserForm(instance=request.user) # reload the amended user data
return render(request, 'myApp/user_details.html',{'user_form': user_form})
这里的关键行是在views.py中,user_form = UserForm(instance=request.user),这里重新加载了表单。 这里的效果是在将数据呈现给用户之前,用清理过的(在这种情况下保存的)数据重新填充表单。 现在,您可以通过对这些字段进行适当的 clean_fieldname 调用,将表单中的每个字符字段更改为小写。
注意:如果您不与数据库交互(或者只是不想从数据库重新加载),您可以按如下方式重新填充表单:
def post(self, request):
user_form = UserForm(request.POST) #gather the post'ed data
if user_form.is_valid():
user_form.process() # process the gathered cleaned data
user_form = UserForm(
{'email': user_form.cleaned_data['email'],
'first_name': user_form.cleaned_data['first_name'],
'last_name': user_form.cleaned_data['last_name'],}
) # reload the form
return render(request, 'myApp/user_details.html',{'user_form': user_form})
作为这里的轻微优化,您可以使用内置检查:
if user_form.has_changed():
继 is_valid() 检查(或与其结合)之后 - 通常,如果表单上没有任何更改,则无需保存或处理表单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.