如何在不修改模板的情况下重新排序Django-allauth自定义表单字段?
解决Django表单字段重新排序的问题
我懂你遇到的困扰——继承django-allauth的SignupForm扩展表单后,想把新增的first_name放在第一个位置,用旧方法keyOrder不管用,还不想改模板代码。别担心,这是因为Django新版本已经弃用了keyOrder,我们用官方推荐的方法就能搞定:
方案1:使用order_fields()方法(推荐)
Django 3.1及以上版本提供了order_fields()方法,专门用来调整表单字段的顺序,代码简洁还官方支持:
from django import forms from allauth.account.forms import SignupForm class UserSignupForm(SignupForm): # 先把新增字段定义在类里(比在__init__里添加更清晰) first_name = forms.CharField(label="Prénom") def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 直接传入想要的字段顺序列表 self.order_fields(['first_name', 'email', 'password1', 'password2'])
方案2:手动重构OrderedDict(兼容旧版本)
如果你用的是Django 3.1以下的版本,可以手动重新构建fields这个有序字典来调整顺序:
from collections import OrderedDict from django import forms from allauth.account.forms import SignupForm class UserSignupForm(SignupForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 动态添加字段(如果一定要在__init__里加的话) self.fields["first_name"] = forms.CharField(label="Prénom") # 定义想要的字段顺序 desired_order = ['first_name', 'email', 'password1', 'password2'] # 重构fields的OrderedDict self.fields = OrderedDict((field_name, self.fields[field_name]) for field_name in desired_order)
为什么之前的keyOrder没用?
因为Django从1.11版本开始就弃用了keyOrder属性,表单的fields现在是一个OrderedDict,字段顺序由这个有序字典的顺序决定,所以直接修改keyOrder不会生效。
这两个方案都不需要修改你的模板代码,保持{{ form|bulma }}的渲染方式就可以,表单会按照你指定的顺序输出字段。
内容的提问来源于stack exchange,提问作者sbm54
相关产品推荐
相关产品推荐

