【问题标题】:Getting current user in django rest framework在 django rest 框架中获取当前用户
【发布时间】:2017-06-16 23:19:11
【问题描述】:

我在获取在 django rest 框架中上传图片的当前用户时遇到了很多麻烦。

Django rest framework 是纯 django 内部的一个应用程序,用于网页。

我正在使用 django rest 框架,以便用户可以在我们的服务器上上传文件......一切都很好,除了我们需要知道上传文件的用户是谁。我真的尝试了该网站和谷歌必须提供的许多解决方案,但无法使其正常工作。这是来自应用程序的代码。我们该怎么办?

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

【问题讨论】:

    标签: django python-3.x django-rest-framework


    【解决方案1】:

    这对我有用。您在上传类(在我的情况下为 Post)中创建一个 ForeignKey 并将其链接到用户(不要忘记进行迁移和迁移)。在您的视图中,当您呈现表单时,请使用instance = form.save(commit = False) -> instance.uploaded_by = request.user-> instance.save(),以便获取当前用户并将其保存在 Post(upload) 模型中。

    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')
           ...
    

    要在管理员中查看用户,您必须在应用程序 admin.py 中安装“uploaded_by”字段。我假设你知道如何如果不是谷歌会帮助你;) 希望有帮助。

    【讨论】:

    • 我在你的代码上取得了一些进展,它帮助我理解了它如何工作的基本原理。我弄清楚后会回复你的。 Ty 为您提供帮助。
    • 所以它显示在管理员中?你写的另一条评论是什么?身份证有问题?听起来您需要在模型中定义 def __str__(self): return self.user.userprofile.name。我的代码是否为您带来了解决方案,或者您找到了自己的解决方案?不管怎样,我很高兴你成功了。
    • 我在 admin.py 中安装(注册)“PostForm”,我可以看到它就好了。是的,我在使用用户 ID 时遇到了问题...这是我的 ID 和用户 ID db {{id:1,name:John},{id:2,name:Robby},{id:3,name:Mary }} .. 并且使用您的代码,它总是显示 John,谁登录并不重要。在结合您的代码和 @AremSudoma 代码后,我弄清楚了。现在效果很好。剩下要做的就是抓住用户的标头,这样我就可以从他们发帖的地方看到 IP :) Ty!!
    • 很高兴听到您成功了。我给了这个人一票,所以他的工作得到了认可;)祝你的项目好运。
    【解决方案2】:

    在我的项目中,我使用 HiddenField 来填充当前用户。例如你的情况:

    class UploadedImageSerializer(serializers.ModelSerializer):
        current_user = serializers.HiddenField(default=serializers.CurrentUserDefault())
    
        class Meta:
            model = UploadedImage
            fields = ('id', 'image','name','Tip','current_user')
    

    【讨论】:

    • 您的代码和@hansTheFranz 的组合对我来说是成功的解决方案。 tnx
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2019-03-11
    • 2022-01-17
    • 2018-05-15
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多