Django Rest Framework - загрузка файлов по ссылке 404 - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь загрузить файл (любой файл) в мою структуру отдыха.

В настоящее время я могу загрузить файл, но по какой-то причине не могу нажать на сгенерированную ссылку. .

Это мои settings.py :

...
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
STATICFILES_DIRS = [os.path.join(BASE_DIR, "site_static")]
STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATIC_URL = '/static/'

Это мои model.py :

...
class FileUpload(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    user_profile = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    datafile = models.FileField(blank=False, null=False)

Это мой views.py :

...
class FileUploadViewSet(viewsets.ModelViewSet):
    """Handles uploading a file"""
    authentication_classes = (TokenAuthentication,)
    serializer_class = (serializers.FileUploadSerializer)
    queryset = models.FileUpload.objects.all()
    parser_classes = (MultiPartParser, FormParser,)
    permission_classes = (
        permissions.UpdateOwnStatus,
        IsAuthenticated
    )

    def perform_create(self, serializer):
        """Sets the user profile"""
        serializer.save(user_profile=self.request.user,
                        datafile=self.request.data.get('datafile'))

Это мой serializer.py :

...
class FileUploadSerializer(serializers.HyperlinkedModelSerializer):
    user_profile = serializers.SlugRelatedField(
        read_only=True,
        slug_field='id'
    )

    class Meta:
        model = models.FileUpload
        fields = ('id', 'user_profile', 'created', 'datafile')
        extra_kwargs = {'user_profile': {'read_only': True},
                        'created': {'read_only': True}}

Это мой полный urls.py :

router = DefaultRouter()
router.register('hello-viewset', views.HelloViewSet, basename='hello-viewset')
router.register('profile', views.UserProfileViewSet)
router.register('feed', views.UserProfileFeedViewSet)
router.register('upload', views.FileUploadViewSet)

urlpatterns = [
    path('hello-view/', views.HelloApiView.as_view()),
    path('login/', views.UserLoginApiView.as_view()),
    path('', include(router.urls)),
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Когда я загружаю файл, поле datafile заполняется местоположением файла, например:

   {
        "id": 2,
        "user_profile": 4,
        "created": "2020-04-27T21:08:16.269058Z",
        "datafile": "http://127.0.0.1:8000/media/test.png"
    },

Я смотрю на файлы проекта и могу найти файл в / media /, однако ссылка не работает.

Как заставить ссылку работать.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Моя проблема, как выясняется, заключается в том, что я неправильно редактировал urls.py.

И в папке api, и в папке проекта есть urls.py.

При добавлении этого urlpattern для правильного проекта urls.py, он отлично работает!

0 голосов
/ 29 апреля 2020

цитата из документации здесь

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
...