Django模型中self函数里的request.user

1 投票
2 回答
1616 浏览
提问于 2025-04-18 10:56

我想在我的模型的自定义函数中获取当前登录的用户。

class My_model(models.Model):
    user = models.OneToOneField(User)
    image = models.ImageField(upload_to='uploads/',default='uploads/no-img.jpg')
    #other fields
    def show_photo(self,request):
        show_photo = False
        if Photo_request.objects.filter(who=request.user,whose=self.user).exists():
            my_request = Photo_request.objects.get(who=request.user,whose=self.user)
            request_accepted = my_request.accepted            
            if request_accepted:
                show_photo = True                  
        return show_photo
    show_photo = property(show_photo)

在我的模板中

{% for profile in profiles %}  
    {% if profile.show_photo %}  
        <img src="{{MEDIA_URL}}{{ profile.image }}" alt="image" />
    {% endif %}
{% endfor %}

但是这个函数没有正常工作。我试过不带请求参数和自定义ID,这样是可以的。我的代码有什么问题吗?

2 个回答

1

我在 threading 包里用了 current_thread 这个函数。

  1. utils/request_utiles.py 文件里添加一个新的中间件,内容如下:

    utils/request_utiles.py

    from threading import current_thread
    from django.utils.deprecation import MiddlewareMixin
    
    _requests = {}
    
    def get_current_request():
        t = current_thread()
        if t not in _requests:
            return None
        return _requests[t]
    
    
    class RequestMiddleware(MiddlewareMixin):
        def process_request(self, request):
            _requests[current_thread()] = request
    
  2. settings.py 文件里添加这个中间件。

    settings.py

    MIDDLEWARE = [
        ...
        'utils.request_utils.RequestMiddleware',
    ]
    
  3. 在任何模型中使用 get_current_request() 函数。

    在你的代码里,可以这样使用:

    from utils.request_utils import get_current_request
    
    class My_model(models.Model):
        user = models.OneToOneField(User)
        image = models.ImageField(upload_to='uploads/',default='uploads/no-img.jpg')
        ...
    
        def show_photo(self):
            request = get_current_request() # you can get current request in here.
    
            show_photo = False      
            if Photo_request.objects.filter(who=request.user,whose=self.user).exists():
                my_request = Photo_request.objects.get(who=request.user, whose=self.user)
                request_accepted = my_request.accepted            
                if request_accepted:
                    show_photo = True                  
            return show_photo
    
        show_photo = property(show_photo)
    
2

编写自定义标签:

my_app/templatetags/my_app_tags.py

from django.template import Library

register = Library()

@register.assignment_tag(takes_context=True)
def show_photo(context):
    request = context['request']
    profile = context['profile']
    return profile.show_photo(request) # Instead of passing request I suggest to pass request.user here

在模板中使用它,首先要加载模板标签:

{% load my_app_tags %}

{% for profile in profiles %}  
    {% show_photo as show %}
    {% if show %}  
        <img src="{{MEDIA_URL}}{{ profile.image }}" alt="image" />
    {% endif %}
{% endfor %}

撰写回答