我有一个带有国家/地区字段的自定义用户模型,我使用django-cities的Country模型作为ForignKey。我还想使用国家名称的本地化。 (我无法导入django-cities的alt_names进行本地化,因此选项不在桌面上)。在我的forms.py中,我尝试用
给出选择字段# forms.py
from cities.models import Country
from django.utils.translation import gettext_lazy as _
class SignupForm(UserCreationForm):
c = Country.objects.all()
country_choices = [(Country.objects.filter(id=c[i].id), c[i].name ) for i in range(len(c)) ]
country_choices_localize = [(c[0], _('{0}'.format(c[1]))) for c in country_choices]
country =
forms.ChoiceField(choices=tuple(country_choices_localize), initial=None)
# view.py
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
这似乎不起作用.Django停止在表单验证if form.is_valid():
我得到了CountryError.objects.filter的ValueError(id = c [i] .id)。说MyUser.country必须是'Country'实例。
是否有工作在ChoiceField中使用本地化以及国家模型?
答案 0 :(得分:1)
确实你得到一个ValuError,因为表单会等待Country的实例,而不是整数(作为id)。我建议您先从表单字段中排除createRegisteredFont(String fontName, int style)
,然后添加一个名为country
的临时字段,并使用此字段
country_temp
在您的视图中获取正确的实例
class SignupForm(UserCreationForm):
class Meta:
exclude = ['country']
model = YourUserModel
def __init__(self, *args, **kwargs):
super(SignupForm, self).__init__(*args, **kwargs)
country_choices = [(country.id, _(country.name)) for country in Country.objects.all()] # get all countries o filter as you need
country_temp = forms.ChoiceField(choices=country_choices, required=True)
答案 1 :(得分:0)
不幸的是,你的列表理解是无稽之谈。您获得所有国家/地区,然后根据长度循环一个范围,然后从原始列表中获取项目,然后再次从数据库中再次查询该项目?这真的不是你如何做Python。并且不需要单独的本地化列表理解。它应该只是:
country_choices_localised = [(i.id, _(i.name)) for i in c]