2017-01-23 2 views
0

all-auth에서 확장 된 사용자 모델을 사용하고 있습니다. 나는 확장 모델 필드 (조직과 같은)와 표준 사용자 필드 (예 : user.email)를 하나만 제외하고 모든 템플릿에서 쉽게 가져올 수 있습니다.일부 템플릿에 사용자 필드가 나타나지 않습니다.

나는 (내가 장고를 처음 접했을 때) 업데이트 폼을 만들기 위해 고심했기 때문에 나는 properties/instances를 사용했다. 이것은 효과가 있었다. 나는 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. 이메일}})이이 템플릿에서 작동하지 않습니다. 그러나 다른 모든 템플릿에서는 완벽하게 작동합니다. RequestContext 정보를 취소하는 내 견해와 관련이 있습니까?

또한 고칠 수있는 바보 같은 오류가 발생하면 미리 감사드립니다.

+0

{{request.user.email}} –

+0

감사합니다. Vivek,하지만 그 해결책은 작동하지 않았습니다. 문제는 Daniel Roseman이 말한 것입니다. render_to_response는 컨텍스트 프로세서를 전달하지 않습니다. 나는 렌더링으로 전환했다. –

답변

0

보기에서 render_to_response을 사용하면 안됩니다. 이는 컨텍스트 프로세서를 실행하지 않으므로 요청 또는 사용자 변수를 추가하지 않습니다. 대신 render를 사용

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

또한 CSRF는 상황에 맞는 프로세서에 의해 추가됩니다 있습니다, 그래서 당신이하고있는 것처럼 수동으로 추가 할 필요가 없다.

+0

완벽한! 컨텍스트 프로세서를 실행하지 않거나 CSRF를 수동으로 더 이상 추가 할 필요가 없다는 것을 나는 알지 못했습니다. 감사. –

관련 문제