Django rest framework ModelViewSet отображает cuttom HTML вместо значения по умолчанию
Я новичок в Django & DRF и я пытаюсь заменить api представление по умолчанию, заданное из ModelViewSet (scr1, scr2, scr3) на пользовательские HTML шаблоны. Представления по умолчанию работают просто отлично, я тестировал с postman и он может выполнять CRUD функции (по крайней мере, так кажется), но я понятия не имею, как заменить представления по умолчанию на пользовательские html страницы. Я следовал документам DRF - это сработало, также искал решения ( вот это было многообещающим), но я просто не могу применить это в моей ситуации. Пожалуйста, помогите!
models.py:
from django.db import models
class Package(models.Model):
prod_name = models.CharField(max_length=255, default=0)
quantity = models.IntegerField(default=0)
unit_price = models.IntegerField(default=0)
def __str__(self):
return self.prod_name
class Orders(models.Model):
order_id = models.CharField(max_length=255, default=0)
package = models.ManyToManyField(Package)
is_cod = models.BooleanField(default=False)
def __str__(self):
return self.order_id
serializers.py:
from rest_framework import serializers
from .models import Package, Orders
class PackageSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField()
prod_name = serializers.CharField(max_length=255, default=0)
quantity = serializers.IntegerField(default=0)
unit_price = serializers.IntegerField(default=0)
class Meta:
model = Package
fields = "__all__"
class OrderSerializer(serializers.HyperlinkedModelSerializer):
package = PackageSerializer(many=True)
def get_or_create_packages(self, packages):
print("this is package in gocp:", packages)
package_ids = []
i = 0
for package in packages:
print("i=", i)
i += 1
package_instance, created = Package.objects.get_or_create(pk=package.get('id'), defaults=package)
print("package id:", package.get('id'))
package_ids.append(package_instance.pk)
print("package_ids:", package_ids)
return package_ids
def create_or_update_packages(self, packages):
package_ids = []
for package in packages:
package_instance, created = Package.objects.update_or_create(pk=package.get('id'), defaults=package)
package_ids.append(package_instance.pk)
return package_ids
def create(self, validated_data):
print("this is validated_data:", validated_data)
package = validated_data.pop('package', [])
print("this is package:", package)
order = Orders.objects.create(**validated_data)
order.package.set(self.get_or_create_packages(package))
return order
def update(self, instance, validated_data):
package = validated_data.pop('package', [])
instance.package.set(self.create_or_update_packages(package))
fields = ['order_id', 'is_cod']
for field in fields:
try:
setattr(instance, field, validated_data[field])
except KeyError: # validated_data may not contain all fields during HTTP PATCH
pass
instance.save()
return instance
class Meta:
model = Orders
fields = "__all__"
views.py:
from .serializers import OrderSerializer, PackageSerializer
from .models import Package, Orders
from rest_framework import viewsets
urls.py:
from django.urls import path, include
router = DefaultRouter()
router.register(r'order', OrderViewSet, basename='orders')
router.register(r'package', PackageViewSet, basename='package')
urlpatterns = [
path('api/', include(router.urls)),
]
Я предполагаю, что:
- нужно изменить список(), создать()/обновить() в views.py (класс OrderViewSet & PackageViewSet), но как? Я перепробовал много разных вариантов определения функций list(), create()/update(), но ничего не помогло, например (в данном конкретном случае мне не разрешается перекрывать существующий метод list): .
@action (renderer_classes=[TemplateHTMLRenderer], detail=True)
def list(self, request, *args, **kwargs):
template_name = 'order_list.html'
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data, template_name='order_list.html')
- Актуальные html-шаблоны должны соответствовать вложенной модели, которая у меня есть, и я не уверен, как она будет работать с вложенными данными. Поскольку я не могу решить 1-й пункт, я не могу проверить и попытаться решить 2-й пункт.
Будет ли работать сериализатор rendering_form? Взять с работы DRF docx exaple?:
{% load rest_framework %}
<html><body>
<h1>Orders - {{ orders.order_id }}</h1>
<form action="{% url 'order-detail' pk=orders.pk %}" method="POST">
{% csrf_token %}
{% render_form serializer %}
<input type="submit" value="Save">
</form>
</body></html>
Возможно, мне следует забыть ModelsViewSet и перейти на APIView? (хотя в данном конкретном случае, если существует решение, я бы предпочел узнать его).
Заранее спасибо!