【问题标题】:ModelForm displays ForeignKey table values, not choicesModelForm 显示 ForeignKey 表值,而不是选项
【发布时间】:2017-01-03 17:49:16
【问题描述】:

我正在创建一个 Django 应用程序,其中每个站点都有一个类别,从一系列可能的类别中选择。所以我有两个模型:SiteCategory

我想要SiteCategory 模型之间的多对一关系。 Category 表包含一系列不同的类别,每个 Site 记录都有一个引用其中一个类别的外键。

models.py:

from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible # for python 2 support

class Site(models.Model):
    Category = models.ForeignKey('Category')

    def __str__(self):
    return self.Name

CATEGORY_CHOICES = (
                    ('AU', 'Automobiles'),
                    ('BE', 'Beauty Products'),
                    ('GR', 'Groceries'),
                    )

class Category(models.Model):
    Category = models.CharField(choices=CATEGORY_CHOICES,max_length=2)

    def __str__(self):
    return '%s' % (self.Category)

forms.py:

from django.forms import ModelForm
from sites.models import Site

class NewSiteForm(ModelForm):
    class Meta:
        model = Site
        fields = ['Category']

newsite.html:

<!DOCTYPE html>
<form method="post" action="">
{{ form}}
</form>

Newsite.html 为我提供了一个 Category 下拉列表,其中列出了已存储在我的 Category 数据库中的值,而不是列出 Category 模型中定义的选择元组的内容。所以我得到了这个:

<!DOCTYPE html>
<form method="post" action="">
<tr><th><label for="id_Category">Category:</label></th><td><select                 id="id_Category" name="Category">
<option value="" selected="selected">---------</option>
<option value="1">AU</option>
<option value="2">BA</option>
<option value="3">BE</option>
<option value="4">BO</option>
<option value="5">PH</option>
<option value="6">CO</option>
<option value="7">CC</option>
<option value="8">CB</option>
<option value="9">CE</option>
<option value="10">CS</option>
<option value="11">CA</option>
<option value="12">EA</option>
<option value="13">EC</option>
<option value="14">FA</option>
<option value="15">GR</option>
<option value="16">HA</option>
<option value="17">HE</option>
<option value="18">HG</option>
<option value="19">IN</option>
<option value="20">JE</option>
<option value="21">LT</option>
<option value="22">MS</option>
<option value="23">MU</option>
<option value="24">MI</option>
<option value="25">OF</option>
<option value="26">OU</option>
<option value="27">PC</option>
<option value="28">SH</option>
<option value="29">SO</option>
<option value="30">SP</option>
<option value="31">TO</option>
<option value="32">TY</option>
<option value="33">DV</option>
<option value="34">CL</option>
<option value="35">WA</option>
<option value="36">WI</option>
</select></td></tr>
</form>

我希望表单只显示模型中定义的三个选项,而不是数据库的内容,像这样:

<!DOCTYPE html>
<form method="post" action="">
<tr><th><label for="id_Category">Category:</label></th><td><select                 id="id_Category" name="Category">
<option value="" selected="selected">---------</option>
<option value="AU">Auto</option>
<option value="BE">Beauty Products</option>
<option value="GR">Groceries</option>
</select></td></tr>
</form>

我在这里有什么不明白的地方,我该如何进行这项工作?

(请注意,CATEGORY_CHOICES 中将有一个元组为Category 表中存储的每个两个字母条目提供一个可读的选择,但我在此问题中没有列出所有这些条目以节省空间)。

【问题讨论】:

    标签: python django django-models django-forms modelform


    【解决方案1】:

    您需要指定Category型号:

    class NewSiteForm(ModelForm):
        class Meta:
            model = Category # <--
            fields = ['Category']
    

    【讨论】:

    • 谢谢,这行得通 - 但我指定 Site 的原因是我想使用 ModelForm 为 Site 模型添加所有字段。相反,指定 Category 会阻止我这样做,并且 ModelForm 似乎不想让我一次指定两个模型。我怎样才能使它成为Site 字段的ModelForm,同时还允许CATEGORY_CHOICES 用于Category 字段?
    【解决方案2】:

    我的模型结构不好。为Category 模型单独选择是没有意义的。我应该做的是:

    1) 要么完全删除Category 模型,直接将CATEGORY_CHOICES 用于Site 模型中的Category 字段,放弃外键的想法。

    2) 将我存储在CATEGORY_CHOICES 中的人类可读值转移到Category 模型的数据库值中。并删除了CATEGORY_CHOICES。我最终选择了这个,因为会有其他字段与Category 相关联,例如“已批准”。因此,拥有一个单独的“类别”模型仍然是有意义的。

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多