我正在尝试为我的项目制作models
。
1)这包括model
CarInfo
,其中包含有关汽车的详细信息,例如年份,品牌和型号。
class CarInfo(models.Model):
year = models.IntegerField(blank=True, null=True)
make=models.OneToOneField('Manufacturer')
2)对于汽车制造,我正在考虑以下模型;
class Manufacturer(models.Model):
CARMAKER_CHOICES=(('Toyota','TOYOTA'),
('ford','FORD'),
('mazda','MAZDA'), ('Honda','HONDA'), )
carmaker=models.CharField(max_length=20,choices=CARMAKER_CHOICES)
3)对于汽车模型,我想制作以下模型,但我不知道如何实现它。
class CarModel(models.Model):
maker=models.ForeignKey(Manufacturer)
# if the manufacturerer is Toyota, the different models are
MODEL_CHOICES=(('Prius','PRIUS'),
('Camry','CAMRY'),
('Rav4','RAV4'),)
carmodel=models.CharField(max_length=20,choices=MODEL_CHOICES)
正如您所看到的,CarModel
取决于制造商,因此汽车型号选择将完全不同。在这种情况下我应该如何建立模型,或者我对更好的替代模型持开放态度。
答案 0 :(得分:0)
单独的Django不能有条件地显示/使用基于另一个的选择。可能最简单的方法是在页面上使用Javascript / jQuery来显示基于先前选择的选项。
或者,你也可以看看使用Django的form wizard在多个阶段显示表单。
无论哪种方式,都必须在表单/模板级别完成,而不是在模型本身。
无法动态根据当前模型中的其他字段填充字段/属性。此外,与其制造商相对应的汽车模型必须存储在某处。目前在MODEL_CHOICES
中,但正如您所解释的那样,您希望根据制造商填充这些内容,以及继续更新元组可能会变得很麻烦,因此最好放在数据库中。
因此,如果我们稍微更改了CarModel
和CarInfo
模型,
class CarModel(models.Model):
carmaker = models.ForeignKey(Manufacturer)
carmodel = models.CharField(max_length=20)
class CarInfo(models.Model):
year = models.IntegerField(blank=True, null=True)
make = models.OneToOneField('Manufacturer')
model = models.CharField(max_length=20)
它可以为我们提供这样的信息:
+-----+------------+------------+
| id | carmaker | carmodel |
+-----+------------+------------+
| 1 | Toyota | Prius |
| 2 | Toyota | Camry |
...
然后,如果我们需要通过CarInfo
过滤/限制模型给他们的制造商,比如在表单中,可以通过简单的查询来完成:
class CarInfoForm(forms.ModelForm):
class Meta:
model = CarInfo
def __init__(self, *args, **kwargs):
super(CarInfoForm, self).__init__(*args, **kwargs)
self.fields['model'] = forms.ModelChoiceField(queryset=CarModel.objects.filter(carmodel=self.instance.carmodel))
同样,通过模板/浏览器中的Javascript或jQuery,这将更加简单。如果您不反对使用第三方库,可以在模型周围添加一些功能作为选择字段:dj-choices,django-smart-select和this django片段是我发现的一些。