代码之家  ›  专栏  ›  技术社区  ›  angraankit

一对多选项不会出现在Django模型中

  •  0
  • angraankit  · 技术社区  · 6 年前

    我对Django还很陌生,我很难搞错Django模型形式中遗漏了什么。我想在表单中显示一个带有预定义值的下拉列表,但由于某些原因,选项从未出现。以下是来自模型.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 %}
    

    请帮我弄清楚出了什么问题。

    enter image description here

    3 回复  |  直到 6 年前
        1
  •  0
  •   user9727749 user9727749    6 年前

    尝试像这样指定models字段,而不是像您所拥有的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选项中最长单词的字符量的数字。我认为你的方式会有问题,因为最大长度是1个字符,但你所有的选择都有超过1个字符。也许因为选择显示有1个字符,它可以工作,但我很确定它会检查第二个值。

    另外,我总是在表单中指定字段值:

    class CreateAdvertisementForm(ModelForm):
        class Meta:
            model = Property
            fields = ('status',)
    

    这将确切地告诉它要渲染哪些字段。由于模型中只有一个字段,所以这看起来似乎有些过分,这应该是显而易见的,但出于安全原因,我认为这是最佳实践。也许其他人可以提供他们的意见。

        2
  •  0
  •   Usama Nadeem    6 年前

    尝试刷新数据库,

    python manage.py migrate --run-syncdb
    

    python manage.py makrmigrations
    python manage.py migrate
    
        3
  •  0
  •   angraankit    6 年前