2011-08-09 6 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 

오케이 내 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 필드 datas를 보여 어쨌든이 있나요?

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 호) 모델 ForeignKeys를해야합니다.

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 
    ) 

당신은 당신 때문에 그렇지 않으면 수행 할 수 없습니다 어쩌면 이것은 심지어 AdminForm을 변경하지 않고, 작동

는 (가장 일반적인 사용은 지시대로 나는 또한, 단수 모델 이름을 변경하고 약간의 반복을 제거) FK가 일치하는 두 개의 모델이 필요합니다. Cars.car_colors.through (쿼리 할 수있는 유효한 모델)을 사용하면 좋은 디스플레이가 없습니다. (더미) 명시 적 중간 모델을 사용하면 유니 코드을 정의하고 관리자는 올바른 데이터를 표시해야합니다.

+0

감사합니다. @saverio – abraham

+0

감사합니다. 아주 간단하고 좋은 예입니다. –