2016-04-30 2 views
0

Можно ли передать какой-либо аргумент из динамического urls (у меня есть ^c/(?P<username>\w+)/^) на заказ context_processors?Как передать аргумент на пользовательский context_processors.py?

views.py (я прохожу username из URL в RequestContext)

def client_profile(request, username): 
    # .... some context 
    return render_to_response('profile.html', context, 
           context_instance=RequestContext(request, username)) 

context_processors.py

def default_profile(request, username): 
    client = get_object_or_404(Client, user__username=username) 
    #.... some default 
    return { 
     'client': client, 
     #.... some default 
    } 

Я стараюсь, но это была ошибка, когда я обновление страницы

default_profile() missing 1 required positional argument: 'username'

Есть ли другой способ сделать что-то подобное? Или это действительно невозможно?

-Спасибо.

+0

Что вы пытаетесь выполнить? Похоже, вы пытаетесь получить модель клиента, которая имеет отношения ForeignKey или OneToOne с моделью пользователя Django.contrib.auth, в контексте вашего шаблона. Это верно? – Del

+0

Да, это так! Но клиент от url, а не от онлайн-клиента (request.user). –

ответ

0

Контекстные процессоры довольно просты, с одним аргументом; HttpRequest

Что вы можете сделать, это добавить что-то к сеансу, потому что это будет доступно через запрос, но если это не что-то общее или общее, то вам часто лучше предоставлять переменные контекста через ваши представления. В частности, в вашем примере, если вы указываете имя пользователя в URL-адресе, вы предоставляете контекст в ответе этого представления, поэтому вы можете просто предоставить client в этот момент.

В любом случае, если вы предоставили что-то через сеанс, ваш код мог бы выглядеть;

def client_profile(request, username): 
    # .... some context 
    request.session['username'] = username 
    return render_to_response(
     'profile.html', context, 
     context_instance=RequestContext(request, username) 
    ) 

def default_profile(request): 
    context = {} 
    if 'username' in request.session: 
     username = request.session['username'] 
     client = get_object_or_404(Client, user__username=username) 
     context.update({ 
      'client': client, 
     }) 

    return context 
+0

Да, спасибо. Это работает! Один из лучших способов, вот что я делаю прямо сейчас. Но, конечно, безопасно ли это? –

+0

@ A.Fynn Конечно, есть некоторые вещи, которые вы не хотите добавлять в данные сеанса по соображениям безопасности/конфиденциальности. Но я думал, что вы здесь должны быть в безопасности. В то же время вы должны подумать о добавлении этого в контекст представления, потому что, если требуется имя пользователя, оно будет работать только для людей на этом URL-адресе, чтобы обработчик контекста был излишним. –

Смежные вопросы