Reputation: 403
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
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
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