Django ForeignKey与ChoiceField本地化相关的领域

时间:2018-01-26 10:22:02

标签: python django geodjango

我有一个带有国家/地区字段的自定义用户模型,我使用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中使用本地化以及国家模型?

2 个答案:

答案 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]