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)),
              ]

Я предполагаю, что:

  1. нужно изменить список(), создать()/обновить() в views.py (класс OrderViewSet & PackageViewSet), но как? Я перепробовал много разных вариантов определения функций list(), create()/update(), но ничего не помогло, например (в данном конкретном случае мне не разрешается перекрывать существующий метод list):
  2. .
@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')

  1. Актуальные 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? (хотя в данном конкретном случае, если существует решение, я бы предпочел узнать его).

Заранее спасибо!

Вернуться на верх