我是Django的新手,正在努力弄清我在Django Model Form中缺少的内容。我想在表单中显示一个带有预定义值的下拉列表,但是由于某些原因,这些选项从不出现。以下是来自models.py
的代码LOAN_STATUS = (
('m', 'Maintenance'),
('o', 'On loan'),
('a', 'Available'),
('r', 'Reserved'),
)
class Status (models.Model):
status = models.CharField(
max_length=50,
choices=LOAN_STATUS,
blank=True,
default='m',
)
class Meta:
db_table = 'Status'
class Property(models.Model):
propertyID = models.AutoField(primary_key=True)
status = models.ForeignKey(Status, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.propertyTitle
以下是来自ModelForm的代码
class CreateAdvertisementForm(ModelForm):
class Meta:
model = Property
exclude = ['propertyID']
fields = ('status',)
以下是我的模板中的代码
{% block body %}
<form method="POST" class="post-form">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>{% endblock %}
请帮助我了解问题所在。
答案 0 :(得分:0)
尝试像这样指定模型字段,而不是在Meta下:
class Status (models.Model):
status = models.CharField(
max_length=50,
choices=LOAN_STATUS,
blank=True,
default='m',
)
class Meta:
db_table = 'Status'
,然后将max_length增加到大于LOAN_STATUS选项中最长单词的字符数的数字。我认为您拥有它的方式会出现问题,因为max_length为1个字符,但是您所有的选择都超过了1个字符。也许因为选择显示有1个字符,所以它可以工作,但是我很确定它将检查第二个值。
此外,我总是在表单中指定字段值:
class CreateAdvertisementForm(ModelForm):
class Meta:
model = Property
fields = ('status',)
这可以准确地告诉您要渲染的字段。由于您的模型中只有1个字段,因此这似乎有些过头了,这应该是显而易见的,但是出于安全原因,我认为这是最佳做法。也许其他人可以对此提供意见。
答案 1 :(得分:0)
尝试刷新数据库,
python manage.py migrate --run-syncdb
然后进行迁移并迁移
python manage.py makrmigrations
python manage.py migrate
答案 2 :(得分:0)
经过一天的奋斗,我终于开始工作了。但是,我真的不确定我是否理解正确。我最终使用python控制台将值插入到数据库中。据我说,Django应该自动处理此问题,因为我已经在models.py中定义了所有可能的值。我在这里想念什么?