django模型选择未填充数据库

时间:2018-11-26 20:26:16

标签: python django django-models django-forms

我有以下代码:

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在其中一个属性中也有一个选择列表,因此我希望它也可以在其中填充数据库。

1 个答案:

答案 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")