2017-01-23 5 views
0

all-authの拡張ユーザーモデルを使用しています。私は拡張モデルフィールド(組織のような)と標準のユーザーフィールド(user.emailのような)の両方を、1つを除くすべてのテンプレートで簡単に取り出すことができます。一部のテンプレートにユーザーフィールドが表示されない

私は更新フォームを作成するのに苦労したので(私は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。電子メール}})はこのテンプレートでは機能しません。しかし、それは他のすべてのテンプレートで完璧に動作します。 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についてもう手動で追加する必要がないことはわかりませんでした。ありがとう。 –

関連する問題