Django模型中的下拉列表

时间:2015-06-30 06:03:00

标签: django django-models django-forms

我想在Django models.py中创建一个字段,它将作为下拉列表呈现,用户可以从那里选择选项。

如果我有5个选择:

  • GREEN
  • BLUE
  • RED
  • ORANGE
  • BLACK

我应该如何在models.pyForms.py中编写代码,以便模板将其呈现为下拉元素?

3 个答案:

答案 0 :(得分:39)

从模型到模板:

<强> 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>

或仅显示您的选择字段:

{{ form.color }}

答案 1 :(得分:13)

在模型https://docs.djangoproject.com/en/1.8/ref/models/fields/#choices中使用choices选项指定CharField或IntegerField,并使用ModelForm https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/

答案 2 :(得分:1)

Django 3.0 版 及更高版本中更好的选择:

您可以使用从新的 models.TextChoices 类继承的内部类。这也提供了一种方便的方式来提供人类可读(和可翻译)的标签,以及为程序员提供一个漂亮的界面。

Official Django documentation

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()