怎么连场?

时间:2011-08-09 22:10:59

标签: django django-models django-admin

这是我的引擎型号

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选项中显示颜色名称,如红色,蓝色,黑色,白色......

你能举个例子吗?

1 个答案:

答案 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 ,管理员应该显示正确的数据。