0

Vehicle이라는 PolymorphicModel 클래스가 있는데이 클래스에서 Car와 Truck이라는 두 클래스를 파생했습니다.일반 뷰에서 PolymorphicModel 클래스 개체를 모델로 제어

저는 UpdateView를 사용하여 업데이트하지만 vehicle_list에서 vehicle_id가 무작위로 생성됩니다. 그리고이 모델은 어떤 차량 유형을 제어해야합니까. 그러나 나는 할 수 없었다.

내 클래스 :보기에서

class Vehicle(PolymorphicModel): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name="ID") 


class Car(Vehicle): 
    car_license = models.CharField(max_length=32) 


class Truck(Vehicle): 
    truck_license = models.CharField(max_length=32) 

:

class VehicleUpdate(UpdateView): 
    car = object 
    if car.car_license is not None: 
     model = Car 
    else: 
     model = Truck 
    fields = '__all__' 

    def get_success_url(self, **kwargs): 
     return reverse_lazy('person-list') 

그러나이 오류주고 : 그건 그렇고

AttributeError: type object 'object' has no attribute 'tr_id' 

을, 나는 ") (isinstance"를 사용하려 그러나 그것은 작동하지 않았다. 어쩌면 PolymorphicModel에 관한 것일 수도 있습니다. 모르겠습니다. class 문이 실행될 때 (함수 정의 외부) 클래스 최고 수준의

class VehicleUpdate(UpdateView): 
    if isinstance(object, Car): 
     model = Car 
    else: 
     model = Truck 
    fields = '__all__' 

    def get_success_url(self, **kwargs): 
     return reverse_lazy('person-list') 
+0

클래스 수준에서 그런 속성에 액세스 할 수 있다고 생각되는 이유는 무엇입니까? –

답변

1

코드가 실행됩니다 - 보통 (클래스가 모듈의 최상위 수준에 정의 => 때), 때 모듈 인 가져옵니다. 즉, object은 이미 object 클래스 또는 모듈에 이전에 "object"라는 이름으로 바인딩 된 것이고 Vehicle 인스턴스는 아닙니다.

클래스 기반보기 (일반 기능보기는 CBV보다 쓰기/읽기/수정하기가 훨씬 쉽습니다.)를 사용하지 않으며 일반적인 CBV를 사용하지 않습니다. 이 인스턴스를 가져 오는 메커니즘이 model 특성에 의존하기 때문에 현재 인스턴스 (self.object - 물론 메소드에서만 사용 가능)에서 클래스의 model 특성을 설정하려고 시도하는 문서는 작동하지 않습니다 ...

부수적으로, CarTruck 클래스 사이의 유일한 차이점이 라이센스 필드의 이름 인 경우 실제로는 r이 적절하지 않으면 liskov 대체 원칙을 위반하므로 실제로는 매우 열악한 디자인입니다. eason.