Как я могу загрузить файл с помощью DRF в моем собственном пользовательском html-шаблоне?

#django #django-rest-framework #django-templates

Вопрос:

models.py

 class Contents(models.Model):

    name = models.CharField(max_length=100)
    formula = models.CharField(max_length=20)
    description = models.TextField(null=True, max_length=100)
    wiki = models.CharField(null=True, max_length=100)
    youtube = models.CharField(null=True, max_length=100)
    file = models.FileField()

    def __str__(self):
        return self.name
 

view.py

 class ContentsListCreateAPIView(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'admin3.html'
    style = {'template_pack': 'rest_framework/vertical/'}

    def get(self, request):
        queryset = Contents.objects.all()
        serializer = ContentsSerializer
        return Response({'serializer': serializer, 'contents': queryset, 'style': self.style})

    def post(self, request):
        queryset = Contents.objects.all()
        serializer = ContentsSerializer(data=request.data)
        print(serializer.is_valid())
        print(serializer.data)
        if serializer.is_valid():
            serializer.save()
            return redirect('contents_list')
        return redirect('contents_list')
 

serializers.py

 from rest_framework import serializers
from .models import Contents


class ContentsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Contents
        fields = '__all__'



                           
 

admin.html

 <form action="{% url 'contents_list' %}" method="POST">
               {% csrf_token %}
               {% render_form serializer %}
               <input type="submit" value="Save">
 

Похоже, что поле файла не получает надлежащего ввода. Я не понимаю, в чем проблема. CreateAPIView хорошо работает, когда я использую шаблон DRF по умолчанию.

Комментарии:

1. Попробуйте добавить enctype='multipart/form-data' в свой <form> тег в HTML

2. да благословит вас Бог! это сразу же исправило проблему, большое вам спасибо