2011-12-21 6 views
0

У меня есть модель профиля пользователя с пользователем (ForeignKey) и user_timezone (CharField). На моей странице шаблона есть раскрывающийся список, который позволяет пользователю выбирать свой часовой пояс, отправлять и все работает отлично. За исключением того, что мне нужно жестко закодировать pk. Я не могу понять, как получить текущего пользователя?Django Custom tag tag & get pk из базы данных

import pytz 
import datetime 
import time 
from pytz import timezone 
from django import template 
from django.contrib.auth.models import User 
from turnover.models import UserProfile 
from django.shortcuts import get_object_or_404 

register = template.Library() 

class TimeNode(template.Node): 
    def __init__(self, format_string): 
     self.format_string = format_string 

    def render(self, context): 
     # Get the user profile and their timezone 
     profile = UserProfile.objects.get(pk=99) #<------ Hard Coded-- 
     set_user_timezone = profile.user_timezone 

     # Set the Timezone 
     dt = datetime.datetime.fromtimestamp(time.time(), pytz.utc) 
     get_timezone = pytz.timezone(u'%s' % set_user_timezone) 
     profile_timezone = get_timezone.normalize(dt.astimezone(get_timezone)).strftime(self.format_string) 
     return profile_timezone 

    @register.tag(name="current_time") 
    def current_time(parser, token): 
     tag_name, format_string = token.split_contents() 
     return TimeNode(format_string[1:-1]) 

ответ

3
request = context.get('request') 
user = request.user 

Но вы должны иметь в настройках:

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'django.core.context_processors.request', 
    ... 
) 
+0

Это было, я не был уверен, как для передачи запроса. После 2 дней попыток все под солнцем было 2 коротких строки кода. Меньше - больше. – Dunwitch

0
class TimeNode(template.Node): 
    def __init__(self, format_string, user): 
     self.format_string = format_string 
     self.user = template.Variable(user) 

    def render(self, context): 
     # Get the user profile and their timezone 
     profile = UserProfile.objects.get(user=self.user) #<------ Hard Coded-- 
     set_user_timezone = profile.user_timezone 

     # Set the Timezone 
     dt = datetime.datetime.fromtimestamp(time.time(), pytz.utc) 
     get_timezone = pytz.timezone(u'%s' % set_user_timezone) 
     profile_timezone = get_timezone.normalize(dt.astimezone(get_timezone)).strftime(self.format_string) 
     return profile_timezone 

    @register.tag(name="current_time") 
    def current_time(parser, token): 
     tag_name, format_string, user = token.split_contents() 
     return TimeNode(format_string[1:-1], user) 

, то вы можете сделать что-то вроде

{% current_time "timestring" request.user %}