我正在创建一个Django应用,其中每个网站都有一个类别,从一系列可能的类别中选择。我有两个模型:Site
和Category
。
我想要Site
和Category
模型之间的多对一关系。 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为我提供了一个“类别”下拉列表,其中列出了已存储在“类别”数据库中的值,而不是列出了“类别”模型中定义的选项元组的内容。所以我得到了这个:
<!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
表中存储的每个双字母条目提供可读选择,但我通过不在其中列出所有这些条目来节省空间题)。
答案 0 :(得分:1)
您需要指定Category
型号:
class NewSiteForm(ModelForm):
class Meta:
model = Category # <--
fields = ['Category']
答案 1 :(得分:0)
我的模型结构不好。对Category
模型进行单独选择没有意义。我应该做的是:
1)刚刚完全删除了Category
模型,并将CATEGORY_CHOICES
直接用于Category
模型中的Site
字段,放弃了外键的概念。
2)将我在CATEGORY_CHOICES
中存储的人类可读值转换为Category
模型的数据库值。并删除了CATEGORY_CHOICES
。我最终选择了这个,因为还有其他与Category
相关联的字段,例如“已批准”。因此,拥有一个单独的“类别”模型仍然是有意义的。