我有以下代码:
class ReportType(models.Model):
REPORT_TYPE_CHOICES = (
('E', 'Earnings'),
('MA', 'Monthly announcement'),
('WA', 'Weekly announcement'),
('SA', 'Sales announcement'),
)
report_type = models.CharField(
max_length=50,
choices=REPORT_TYPE_CHOICES,
default="Earnings"
)
def __str__(self):
return self.report_type
这只是模型类之一,其中包括一个字段的choices属性。但是,在执行“ makemigrations”然后“迁移”时,管理工具会创建数据库表,但不会在数据库表属性中填充应执行的选择中的数据。结果是,当我在模型中使用此模型时,单击表单中的下拉框时,会得到一个空的下拉列表。
几乎所有包含选择字段的模型类都会出现此问题,但是其中一个模型类实际上正在工作,但是除了实际选择内容不同之外,它具有相同的代码。
有人知道为什么django管理工具没有将choices属性中的数据填充到数据库表中吗?我看不到代码有任何问题。
编辑: 报告类的模型形式:
class ReportForm(ModelForm):
class Meta:
model = Report
fields = ['profile', 'name', 'report_type', 'time_period', 'link']
ReportType自身未附加任何模型,但它是Report类中的外键。
报告模型具有以下代码:
class Report(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
report_type = models.ForeignKey(ReportType)
time_period = models.ForeignKey(ReportTimePeriod)
link = models.URLField(max_length=500)
report_conclusion = models.CharField(max_length=500, default="No conclusion yet")
market_reaction = models.CharField(max_length=500, default="No market reaction yet")
ReportTimePeriod在其中一个属性中也有一个选择列表,因此我希望它也可以在其中填充数据库。
答案 0 :(得分:3)
您在误解事物的工作方式,ModelForm
模型的Report
将寻找ReportType
实例以预先填充html模板中的选择。您需要先创建ReportType
个实例。
根据您的ReportType
模型和您的问题判断,我认为您认为Django将为每个ReportType
创建一个REPORT_TYPE_CHOICES
实例,但事实并非如此。字段中的choices
属性用于验证。如果您现在想要保持模型不变,则需要为每个ReportType
值创建一个REPORT_TYPE_CHOICES
实例。
现在,除非您有充分的理由拥有ReportType
模型,否则可以通过以下方式更改Report
模型:
REPORT_TYPE_CHOICES = (
('E', 'Earnings'),
('MA', 'Monthly announcement'),
('WA', 'Weekly announcement'),
('SA', 'Sales announcement'),
)
class Report(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
report_type = models.CharField(
max_length=50,
choices=REPORT_TYPE_CHOICES,
default="E" # note we use the Key here
)
time_period = models.ForeignKey(ReportTimePeriod)
link = models.URLField(max_length=500)
report_conclusion = models.CharField(max_length=500, default="No conclusion yet")
market_reaction = models.CharField(max_length=500, default="No market reaction yet")