簡體   English   中英

將所有 CharField 表單字段輸入轉換為 Django 表單中的小寫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM