首页 > 解决方案 > django 模型选择未填充数据库

问题描述

我有以下代码:

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

这只是模型类之一,其中包括一个字段的选择属性。但是,当执行“makemigrations”然后“迁移”时,管理工具会创建数据库表,但不会使用它应该执行的选择中的数据填充数据库表属性。结果是,当我在模型中使用此模型时,单击表单中的下拉框时会得到一个空的下拉列表。

几乎所有包含选择字段的模型类都会出现此问题,但其中一个模型类实际上正在工作,但除了实际选择中的不同内容外,它具有相同的代码。

有人知道为什么 django 管理工具没有将选择属性中的数据填充到数据库表中吗?我看不出代码有任何问题。

编辑:报告类的模型形式:

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

标签: pythondjangodjango-modelsdjango-forms

解决方案


您误解了事情的工作方式,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")

推荐阅读