如何实现用数据库中的值填充的下拉列表

How to implement a dropdown populated with values from a database

我是 Python 和 Django 的新手,因此遇到了这个问题。我想要做的是使用 Django 表单创建 HTML Select 标记的行为。 dropdown/select 必须用数据库中的值填充。

我已经拥有的是 location = forms.ModelChoiceField(queryset = MyModel.objects.all()),它确实给了我一个 select/drowpdown 控件,但我需要它来显示数据库中的一个值,并将不同的值作为实际值(均来自相同 table 只是不同的列)

我在 HTML 代码中的意思是这样的:

<select>
  <option value="1">Berlin</option>
  <option value="2">New York</option>
  <option value="3">London</option>
  <option value="4">Riga</option>
</select> 

所以,使用表格我会看到城市的名称,例如。伦敦,但是当它被 selected 并调用提交时,我在数据库中插入了 3。

期待您的建议。

编辑:

class Event(models.Model):
    eventid = models.AutoField(primary_key=True)
    date = models.DateField(blank=True, null=True)
    time = models.TimeField(blank=True, null=True)
    description = models.CharField(max_length=2000, blank=True, null=True)
    price = models.IntegerField(blank=True, null=True)
    locationid = models.ForeignKey(Location, models.DO_NOTHING, db_column='locationid', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'event'

class Location(models.Model):
    locationid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, blank=True, null=True)
    capacity = models.IntegerField(blank=True, null=True)
    type = models.CharField(max_length=256, blank=True, null=True)
    cityid = models.ForeignKey(City, models.DO_NOTHING, db_column='cityid', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'location'

所以我有另一个 table 的 ID 引用,我想从中获取位置名称并用这些名称填充 select/dropdown。当用户执行 select 时,它不应该采用名称,而是 integer/id。这有意义吗?

你可以试试这个

在forms.py

class your_form(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(your_form, self).__init__(*args, **kwargs)
        self.fields['location'].label_from_instance = self.label_from_instance

    @staticmethod
    def label_from_instance(obj):
        return "Label %s" % obj.name

from docs

from django.forms import ModelChoiceField

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "My Object #%i" % obj.id

参考this