2017-01-23 4 views
0

Я использую расширенную модель пользователя из all-auth. Я могу легко перемещать как расширенные поля модели (например, организацию), так и стандартные поля пользователя (например, user.email) во всех шаблонах, кроме одного.Поля пользователя, не отображающиеся на некоторых шаблонах

Поскольку я изо всех сил пытался создать форму обновления (поскольку я еще новичок в Django), я закончил использование свойств/экземпляров. Это сработало. Я могу редактировать orgnization. Но по какой-то причине в этом шаблоне я не могу позвонить user.email. Я пробовал все его варианты: от RequestContext до неудачных попыток передать его другими способами.

Модель:

from django.db import models 
from django.contrib.auth.models import User 

class Profile(models.Model): 
    user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE) 
    organization = models.CharField(max_length=100) 

    def __str__(self): 
     return self.user.organization 

# I got this from an old tutorial: 
User.profile_p = property(lambda u: Profile.objects.get_or_create(user=u)[0]) 

Вид:

from django.shortcuts import render, render_to_response 
from django.http import HttpResponseRedirect 
from django.template.context_processors import csrf 
from .forms import UserProfileForm 
from django.contrib.auth.decorators import login_required 
from django.contrib.auth.models import User 
from .models import Profile 

@login_required 
def user_profile(request): 
    if request.method == 'POST': 
     form = UserProfileForm(request.POST, instance=request.user.profile_p) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/base_home.html') 
    else: 
     logged_user = request.user 
     profile = logged_user.profile_p 
     form = UserProfileForm(instance=logged_user.profile_p) 

    args = {} 
    args.update(csrf(request)) 

    args['form'] = form 

    return render_to_response('profile.html', args) 

шаблона:

{% extends 'base.html' %} 
<title>{% block title %}Admul:{% endblock %}</title> 
{% block content %} 
<div id="cd_content"> 
    <div class="container-fluid"> 
     <div class="row-fluid"> 
      <h3>Account Details for: {{ user.email }}</h3> 
      <div class="widget-box"> 
       <div class="widget-content nopadding"> 
        {% for field in form %} 
         {{field.error}} 
        {% endfor %} 
        <form method="post" action="/cust_profile/profile/"> 
         {% csrf_token %} 
         {{ form.as_p }} 
         <button type="submit">Edit &raquo;</button> 
        </form> 
       </div> 
       </div> 
     </div> 
    </div> 
</div> 
{% endblock %} 

По какой-то причине, user.email или много его вариаций (например, {{request.user. email}}) не работает в этом шаблоне. Тем не менее, он отлично работает во всех других шаблонах. Это связано с тем, что мой взгляд отменяет передачу информации RequestContext?

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

+0

use {{request.user.email}} –

+0

Спасибо Vivek, но это решение не сработало. Проблема была в том, что сказал Даниэль Роземан: render_to_response не передает процессоры контекста. Я переключился на рендер. –

ответ

0

На ваш взгляд, вы не должны использовать render_to_response. Это не запускает контекстные процессоры и поэтому не добавляет переменные запроса или пользователя. Используйте render вместо:

return render(request, 'profile.html', args) 

отметить также, что CSRF будет добавлен контекстным процессором, так что нет необходимости добавлять его вручную, как вы делаете.

+0

Отлично! Я не знал, что re: не запускать процессоры контекста или о CSRF, которые больше не нужно добавлять вручную. Благодарю. –

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

  • Нет связанных вопросов^_^