【问题标题】:Dropdown in Django ModelDjango 模型中的下拉菜单
【发布时间】:2015-09-16 19:16:48
【问题描述】:

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

如果我有 5 个选择:

  • 绿色
  • 蓝色
  • 红色
  • 橙色
  • 黑色

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

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    从模型到模板:

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

    【讨论】:

    • 您还应该包含一个urls.py,其中您有类似(Django 2.0+)、urlpatterns = [ path('', views.home, name='home'), path('abc', views.CreateMyModelView.as_view(), name='abc') ]
    • 我们可以在没有“创建”按钮的情况下制作它吗?
    • 如果我想选择两个或三个像 ["green","blue"] 这样的 cos 怎么办
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-05-31
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2020-03-19
        • 2011-10-31
        • 2015-11-18
        • 1970-01-01
        相关资源
        最近更新 更多