2011-08-09 9 views
0

この私のエンジンモデルフィールドを連鎖する方法は?

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フィールド件のデータで表示するとにかくはありますか?

def __unicode__(self): 
    return self.car_model 

は、どのように私は、フィールドをcolor_nameするavailable_colorsフィールドをチェーンすることができます:私はそれを設定する必要があるため、単にcar_model参照してください?私はavailable_colorsの選択肢に赤、青、黒、白のような色の名前を表示したいと思います...

私に例を教えてもらえますか?

+0

「ChainedForeignKey」とは何ですか?それはどこから来たのですか?それは何をするためのものか? –

+0

https://github.com/digi604/django-smart-selects – abraham

答えて

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 
    ) 

、両方の参照フィールドが同じ(第3)モデルへのForeignKeyでなければなりません。

多分これが(私も単数形にモデル名を変更し、最も一般的な使用が指示として、いくつかの繰り返しを除く)でも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が一致する2つのモデルが必要です。 Cars.car_colors.through(これは有効なモデルなど)を使用すると、適切な表示が得られません。 (ダミー)明示的中間モデルでは、ユニコードと定義し、管理者は正しいデータを表示する必要があります。

+0

謝辞@saverio – abraham

+0

ありがとう!!非常にシンプルで素敵な例です。 –

関連する問題