我有一个名为Vehicle的PolymorphicModel类,我从中派生了两个类:Car and Truck。
我使用UpdateView进行更新,但它随机从vehicle_list获取vehicle_id。我必须控制这种型号的车型。但我不能。
我的课程:
pipeline
在视图中:
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')
顺便说一句,我尝试使用“isinstance()”但它没有用。也许这是关于PolymorphicModel,我不知道。
AttributeError: type object 'object' has no attribute 'tr_id'
答案 0 :(得分:1)
执行class
语句时执行类顶级(函数定义之外)的代码 - 通常(=>当类在模块的顶级定义时),当模块已导入。这意味着此时object
很可能是内置的object
类,或者是先前在模块中绑定到名称“object”的任何类,并且绝对不是Vehicle
实例。
我很少使用基于类的视图(大多数情况下普通函数视图比CBV更容易编写/读取/修改)并且从不使用通用CBV,因此我无法确定但是从doc看起来试图从当前实例设置类的model
属性(self.object
- 当然只能通过方法获得)不会起作用,因为获取此实例的机制依赖于model
属性...
作为旁注,如果您Car
和Truck
类之间的唯一区别是许可字段的名称,那么实际上它的设计非常糟糕,因为它实际上打破了liskov替换原则原因。