django localflavors美国

Eva*_*611 7 django django-templates

以下显示而不是我的模板中的字段.

<django.contrib.localflavor.us.forms.USStateSelect object at 0x92b136c>
Run Code Online (Sandbox Code Playgroud)

我的模板有

{{ form.state }}
Run Code Online (Sandbox Code Playgroud)

问题是什么?

class RegistrationForm(forms.Form):

    first_name = forms.CharField(max_length=20)
    last_name = forms.CharField(max_length=20)
    phone = USPhoneNumberField()
    address1 = forms.CharField(max_length=45)
    address2 = forms.CharField(max_length=45)
    city = forms.CharField(max_length=50)
    state = USStateSelect()
    zip = USZipCodeField()
Run Code Online (Sandbox Code Playgroud)

还有,我可以使州和拉链可选吗?

Fra*_*ook 9

要将选项限制在下拉列表中,请us.us_states.STATE_CHOICES在模型中使用,us.forms.USStateField()而不是us.forms.USStateSelect()在表单中使用.

要在表单中创建字段可选,请添加blank = True到模型中的该字段.

from django.contrib.localflavor.us.us_states import STATE_CHOICES
from django.contrib.localflavor.us.models import USStateField

class ExampleLocation(models.Model):
    address1 = models.CharField(max_length=45) #this is not optional in a form
    address2 = models.CharField(max_length=45, blank = True) #this is made optional 
    state = USStateField(choices = STATE_CHOICES)
Run Code Online (Sandbox Code Playgroud)

而不是STATE_CHOICES,您可以localflavor文档中找到几个选项.STATE_CHOICES是最具包容性的,但这可能不是你想要的.如果您只想要50个状态,再加上DC,请使用US_STATES.


这个答案假设您正在使用ModelForms.如果你不是,你应该.一旦你制作了模型,就应该遵循DRY并创建基本形式,如下所示:

from django.forms import ModelForm

class ExampleForm(ModelForm):
    class Meta:
        model = ExampleLocation
Run Code Online (Sandbox Code Playgroud)

它继承了模型中的字段.如果您不想要整个模型,可以使用其他class Meta选项(如fields或)自定义可用的字段exclude.模型表单与任何其他表单一样可自定义,它们只是从模型字段的假设开始.