这是我的引擎型号
from django.db import models
class Colors(models.Model):
color_name = models.CharField(max_length=50)
def __unicode__(self):
return self.color_name
这是我的汽车模型
from django.db import models
class Cars(models.Model):
car_model = models.CharField(max_length=50)
car_colors = models.ManytoManyField(Colors, related_name='Car Colors')
def __unicode__(self):
return self.car_model
O.K。我们来看看我的CarsData模型。
这是我的CarsData模型
from django.db import models
class CarsData(models.Model):
car_barcode= models.CharField(max_length=50)
available_color = ChainedForeignKey(
Cars,
chained_field="car_model",
chained_model_field="car_colors",
show_all=False,
auto_choose=True
)
def __unicode__(self):
return self.car_barcode
我的admin.py看起来像这样:
from django.contrib import admin
from django import forms
from myapp.models import *
class CarsDataAdminForm(forms.ModelForm):
class Meta:
model = CarsData
def __init__(self, *arg, **kwargs):
super(CarsDataAdminForm, self).__init__(*arg, **kwargs)
self.fields['available_color'].choices = [(csc.id,csc.car_colors) for csc in Cars.objects.all()
class CarsDataAdmin(admin.ModelAdmin):
form = CarsDataAdminForm
admin.site.register(CarsData,CarsDataAdmin)
无论如何,在ChoiceField中只显示'color_name字段数据?我只看到car_model,因为我必须设置它:
def __unicode__(self):
return self.car_model
如何将available_colors字段链接到color_name字段?我想在available_colors选项中显示颜色名称,如红色,蓝色,黑色,白色......
你能举个例子吗?
答案 0 :(得分:1)
我想我没有得到你的代码:
class CarsData(models.Model):
car_barcode = models.CharField(max_length=50)
available_color = ChainedForeignKey(
Cars,
chained_field="car_model", # should be a field in THIS model
chained_model_field="car_colors", # should be the matching field
# in the Cars model
show_all=False,
auto_choose=True
)
两个引用的字段必须是ForeignKeys到同一个(第三个)模型。
也许这有效,即使不更改AdminForm(我也将模型名称更改为单数并删除一些重复,因为最常见的用途指示):
class Color(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class CarModel(models.Model):
model = models.CharField(max_length=50)
available_colors = models.ManytoManyField(Color, through='AvailableColor')
def __unicode__(self):
return self.model
class AvailableColor(models.Model):
car_model = models.ForeignKey(CarModel)
color = models.ForeignKey(Color)
def __unicode__(self):
return unicode(self.color)
class CarData(models.Model):
car_barcode = models.CharField(max_length=50)
car_model = models.ForeignKey(CarModel)
car_color = ChainedForeignKey(
AvailableColor,
chained_field="car_model", # field in CarData
chained_model_field="car_model", # field in AvailableColor
show_all=False,
auto_choose=True
)
你不能这样做,因为你需要两个匹配FK的模型。使用Cars.car_colors.through
(这是一个有效的模型可以查询等),你没有很好的显示。使用(虚拟)显式中间模型,您可以定义 unicode ,管理员应该显示正确的数据。