Выбор модели Django не заполняет базу данных - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код:

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» и затем «migrate», инструмент управления создает таблицу базы данных, но не заполняет атрибут таблицы базы данных данными, которые он должен делать.В результате, когда я использую эту модель в модели, я получаю пустой раскрывающийся список при щелчке по раскрывающемуся списку в форме.

Эта проблема возникает почти во всех классах моделей, которые включаютполе выбора, но на самом деле работает один из классов модели, но он имеет тот же код, за исключением разного содержимого в фактическом выборе.

Кто-то знает, почему инструмент управления django не заполняет данные ватрибуты выбора в таблицу базы данных?Я не вижу никаких проблем с кодом.

РЕДАКТИРОВАТЬ: Modelform для класса отчета:

class ReportForm(ModelForm):
    class Meta:
        model = Report
        fields = ['profile', 'name', 'report_type', 'time_period', 'link']

ReportType не имеет прикрепленной к себе формы модели, но это чужой ключ вКласс отчета.

Модель отчета имеет следующий код:

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 голосов
/ 26 ноября 2018

Вы неправильно понимаете, как все работает, 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")
...