這讓我很沮喪。我正在使用 Django 和 REST API 構建模型,但無法將個別汽車的 DetailView 渲染到瀏覽器。ListView 作業正常,但我也會包含代碼,因為它們是相互關聯的。
特別是,我無法使 get_object() 函式正常作業。
這是我使用的第一種方法
視圖.py
class CarDetailView(generics.RetrieveUpdateDestroyAPIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'car-detail.html'
queryset = Car.objects.all()
lookup_field = Car.id
@action(detail=True, renderer_classes=[TemplateHTMLRenderer])
def get(self, request, *args, **kwargs):
car = self.get_object()
return Response({
'car': car,
})
雖然頁面正確呈現且沒有錯誤,但模板標簽均無效。只有 {{ car??.model }},回傳None。
所以我更改了代碼以使用 self.get_object()
class CarDetailView(generics.GenericAPIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'car-detail.html'
queryset = Car.objects.all()
lookup_field = Car.id
def get(self, request, id):
serializer_class = CarSerializer
car = self.get_object()
id = Car.id
return Response({
'car': car,
})
但這會引發錯誤:
“AttributeError at /rentals/car/43c9b98d-9f2d-473f-9c34-7b2e25630278 'CarDetailView' 物件沒有屬性 '_meta'”
你能幫忙嗎?我已經在這里查看了之前的大部分問題(這是我學會將 self 傳遞給get函式等的地方......)但我仍然被卡住了。
這是代碼:
視圖.py
class CarListView(generics.ListCreateAPIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'car-list.html'
def get(self, request):
car_list = Car.objects.all()
serializer_class = CarSerializer
return Response({
'car_list': car_list,
})
class CarDetailView(generics.GenericAPIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'car-detail.html'
queryset = Car.objects.all()
lookup_field = Car.id
def get(self, request, id):
serializer_class = CarSerializer
car = self.get_object()
id = Car.id
return Response({
'car': car,
})
序列化程式.py
class CarSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='rental:car-detail', format='html')
class Meta:
model = Car
fields = ['url', 'id', 'manufacturer', 'model', 'owner', 'color', 'year']
模型.py
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET_NULL, null=True)
model = models.ForeignKey(CarModel, on_delete=models.SET_NULL, null=True)
# Model year. Validator ensures that no model year can be set in the future.
year = models.IntegerField(validators=[MaxValueValidator(int(datetime.date.today().year) 1)], null=True, default=2022)
...
Other fields for drivetrain, engine etc
...
# Fields for individual car in database
id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="Automatically generated unique ID. Do not change.")
mileage = models.IntegerField(null=True)
insurance = models.ForeignKey(Insurance, on_delete=models.RESTRICT, null=True)
daily_rate = models.IntegerField(default=3500, help_text="Daily rate in Kenyan Shillings")
def __str__(self):
return f'{ self.manufacturer } { self.model }'
@property
def insurance_expired(self):
"""Determines if insurance is expired based on due date and current date."""
return bool(self.insurance.expiry_date and datetime.date.today() > self.insurance.expiry_date)
class Meta:
ordering = []
permissions = (("can_change_availability", "Set car as rented"),)
def get_absolute_url(self):
return reverse('rental:car-detail', args=[str(self.id)])
網址.py
from django.urls import path, include
from . import views
app_name = 'rental'
# API endpoints
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('cars/', views.CarListView.as_view(), name='car-list'),
path('car/<uuid:id>', views.CarDetailView.as_view(), name='car-detail'),
]
錯誤代碼
AttributeError at /rentals/car/43c9b98d-9f2d-473f-9c34-7b2e25630278
'CarDetailView' object has no attribute '_meta'
Request Method: GET
Request URL: http://localhost:8000/rentals/car/43c9b98d-9f2d-473f-9c34-7b2e25630278
Django Version: 4.1.3
Exception Type: AttributeError
Exception Value:
'CarDetailView' object has no attribute '_meta'
uj5u.com熱心網友回復:
通常你不應該自己實作這個get()方法,這通常是 Django (API) 視圖的任務,然后將它傳遞給正確的渲染器和模板。你
class CarDetailView(generics.RetrieveAPIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'car-detail.html'
serializer_class = CarSerializer
queryset = Car.objects.all()
在模板中,您可以使用汽車的欄位,因此:{{ url }}、{{ model }}、{{ owner }}等。
但是,如果您打算渲染模板,那么使用[Django-doc]可能更有意義:DetailView
from django.views.generic.detail import DetailView
class CarDetailView(DetailView):
model = Car
template_name = 'car-detail.html'
在模板中,您可以使用{{ object.url }}、{{ object.model }}等,也可以“跟隨”關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/533807.html
標籤:Python姜戈休息
