Marine Fighter
Marine Fighter

Reputation: 403

Getting current user in django rest framework

I'm having a lot of trouble over getting the current user that is uploading image in django rest framework.

Django rest framework is an app inside the pure django that is used for webpage.

Im using django rest framework so that users can upload files on our server... Everything works great except we need to know who was the user that uploaded it. I really tried many solutions that this site and google has to offer but just can't make it work. Here is the code from the app. What do we have to do?

viewset.py

from rest_framework import viewsets, filters
from api.serializers import UploadedImageSerializer # import our serializer
from api.models import UploadedImage # import our model

class UploadedImagesViewSet(viewsets.ModelViewSet):
    queryset = UploadedImage.objects.order_by('-id')[:1]
    serializer_class = UploadedImageSerializer

serializer.py

from rest_framework import serializers
from api.models import UploadedImage # Import our UploadedImage model


class UploadedImageSerializer(serializers.ModelSerializer):
    # Create a custom method field
# current_user = serializers.SerializerMethodField('_user')

class Meta:
    model = UploadedImage
    fields = ('id', 'image','name','Tip','curent_user') # only serialize the primary key and the image field

models.py

from django.db import models
import uuid,os
import sqlite3
import Function1
import Function2
from django.contrib.auth.models import User

def scramble_uploaded_filename(instance, filename):
    extension = filename.split(".")[-1]

    return "{}.{}".format(uuid.uuid4(), extension)

def filename(instance, filename):
    return filename


# Our main model: Uploaded Image
class UploadedImage(models.Model):
    image = models.ImageField("Uploaded image",upload_to=scramble_uploaded_filename)
    Tip = models.IntegerField("Captcha type")
    curent_user = models.CharField("Curent user",editable=False,max_length=100,default='')

    def filen(self) :
        path = self.image.path
        tip = self.Tip
        writez = Function1.File_input(path,tip)
        text = Function2.File_input (writez,0.83,tip)
        return text
    name = filen

views.py

from rest_framework import viewsets
from api.serializers import UploadedImageSerializer
from api.models import UploadedImage


class UploadViewSet(viewsets.ModelViewSet):
    """
    API endpoint
    """
    queryset = UploadedImage.objects.all()
    serializer_class = UploadedImageSerializer

Upvotes: 1

Views: 4552

Answers (2)

Artem Sudoma
Artem Sudoma

Reputation: 56

In my projects I use HiddenField for filling the current user. For example for your case:

class UploadedImageSerializer(serializers.ModelSerializer):
    current_user = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = UploadedImage
        fields = ('id', 'image','name','Tip','current_user')

Upvotes: 3

hansTheFranz
hansTheFranz

Reputation: 2570

This works for me. You make a a ForeignKey inside the upload Class (in my case Post) and link it to the User(don't forget to make migrations and migrate). In your View when you render the form go with instance = form.save(commit = False) -> instance.uploaded_by = request.user-> instance.save() so you fetch the current user and its saved in the Post(upload) Model.

views.py:

def upload(request):
    form = PostForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        instance = form.save(commit = False)
        instance.uploaded_by = request.user
        instance.save()
        form.save_m2m()

models.py:

class Post(models.Model):
       uploaded_by = models.ForeignKey('auth.User',default=1,related_name='uploads')
       ...

To see the User in the Admin you would have to install the field "uploaded_by" in your apps admin.py. I assume you know how to if not google will help you ;) Hope that helped.

Upvotes: 2

Related Questions