Django模型中self函数里的request.user
我想在我的模型的自定义函数中获取当前登录的用户。
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
这个函数。
在 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
在 settings.py 文件里添加这个中间件。
settings.py
MIDDLEWARE = [ ... 'utils.request_utils.RequestMiddleware', ]
在任何模型中使用 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 %}