Django 模型中的下拉列表
Dropdown in Django Model
我想在 Django models.py
中创建一个字段,它将呈现为下拉列表,用户可以从那里 select 选择选项。
如果我有5个选择:
- 绿色
- 蓝色
- 红色
- 橙色
- 黑色
我应该如何在 models.py
和 Forms.py
中编写代码,以便模板将其呈现为下拉元素?
在模型中使用 choices
选项指定 CharField 或 IntegerField https://docs.djangoproject.com/en/dev/ref/models/fields/#choices and use ModelForm https://docs.djangoproject.com/en/dev/topics/forms/modelforms/。
从模型到模板:
models.py
COLOR_CHOICES = (
('green','GREEN'),
('blue', 'BLUE'),
('red','RED'),
('orange','ORANGE'),
('black','BLACK'),
)
class MyModel(models.Model):
color = models.CharField(max_length=6, choices=COLOR_CHOICES, default='green')
forms.py
class MyModelForm(ModelForm):
class Meta:
model = MyModel
fields = ['color']
views.py
class CreateMyModelView(CreateView):
model = MyModel
form_class = MyModelForm
template_name = 'myapp/template.html'
success_url = 'myapp/success.html'
template.html
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create" />
</form>
或仅显示您的 select 字段:
{{ form.color }}
Django 版本 3.0 和更高版本中更好的选择:
您可以使用继承自新 models.TextChoices class 的内部 classes。这也提供了一种方便的方式来提供人类可读(和可翻译)的标签,并为程序员提供了一个很好的界面。
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')
year_in_school = models.CharField(
max_length=2,
choices=YearInSchool.choices,
default=YearInSchool.FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in {
self.YearInSchool.JUNIOR,
self.YearInSchool.SENIOR,
}
###########
# human readable text can then be called by...
Student.YearInSchool.Junior.label
# or from an instance by <instance>.get_<innerclass name>_display() like...
student_inst.get_yearinschool_display()
我想在 Django models.py
中创建一个字段,它将呈现为下拉列表,用户可以从那里 select 选择选项。
如果我有5个选择:
- 绿色
- 蓝色
- 红色
- 橙色
- 黑色
我应该如何在 models.py
和 Forms.py
中编写代码,以便模板将其呈现为下拉元素?
在模型中使用 choices
选项指定 CharField 或 IntegerField https://docs.djangoproject.com/en/dev/ref/models/fields/#choices and use ModelForm https://docs.djangoproject.com/en/dev/topics/forms/modelforms/。
从模型到模板:
models.py
COLOR_CHOICES = (
('green','GREEN'),
('blue', 'BLUE'),
('red','RED'),
('orange','ORANGE'),
('black','BLACK'),
)
class MyModel(models.Model):
color = models.CharField(max_length=6, choices=COLOR_CHOICES, default='green')
forms.py
class MyModelForm(ModelForm):
class Meta:
model = MyModel
fields = ['color']
views.py
class CreateMyModelView(CreateView):
model = MyModel
form_class = MyModelForm
template_name = 'myapp/template.html'
success_url = 'myapp/success.html'
template.html
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create" />
</form>
或仅显示您的 select 字段:
{{ form.color }}
Django 版本 3.0 和更高版本中更好的选择:
您可以使用继承自新 models.TextChoices class 的内部 classes。这也提供了一种方便的方式来提供人类可读(和可翻译)的标签,并为程序员提供了一个很好的界面。
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')
year_in_school = models.CharField(
max_length=2,
choices=YearInSchool.choices,
default=YearInSchool.FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in {
self.YearInSchool.JUNIOR,
self.YearInSchool.SENIOR,
}
###########
# human readable text can then be called by...
Student.YearInSchool.Junior.label
# or from an instance by <instance>.get_<innerclass name>_display() like...
student_inst.get_yearinschool_display()