[英]Django request.user in model self function
我想在我的模型 self 函數中獲取當前登錄的用戶。 我試過這個。
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,那是有效的。 我的代碼有問題嗎?
編寫自定義標簽:
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
通過加載 template_tags 在模板中使用它:
{% load my_app_tags %}
{% for profile in profiles %}
{% show_photo as show %}
{% if show %}
<img src="{{MEDIA_URL}}{{ profile.image }}" alt="image" />
{% endif %}
{% endfor %}
我在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文件中添加中間件
設置.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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.