用户字段未出现在某些模板上
User fields not appearing on some templates
我正在使用来自 all-auth 的扩展用户模型。我能够在除一个模板之外的所有模板上轻松拉出扩展模型字段(如组织)以及标准用户字段(如 user.email)。
因为我努力构建更新表单(因为我还是 Django 的新手),所以我最终使用了 properties/instances。这奏效了。我可以编辑组织。但出于某种原因,我无法在此模板上调用 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 »</button>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
出于某种原因,user.email 或其许多变体(如 {{request.user.email}} )在此模板中不起作用。但是,它在所有其他模板中工作得非常好。是否与我的视图取消传递 RequestContext 信息有关?
此外,如果您看到我犯了任何其他可以修复的愚蠢错误,请提前致谢。
您不应该在您的视图中使用 render_to_response
。那不 运行 上下文处理器,因此不添加请求或用户变量。使用 render
代替:
return render(request, 'profile.html', args)
另请注意,CSRF 将由上下文处理器添加,因此无需像您那样手动添加。
我正在使用来自 all-auth 的扩展用户模型。我能够在除一个模板之外的所有模板上轻松拉出扩展模型字段(如组织)以及标准用户字段(如 user.email)。
因为我努力构建更新表单(因为我还是 Django 的新手),所以我最终使用了 properties/instances。这奏效了。我可以编辑组织。但出于某种原因,我无法在此模板上调用 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 »</button>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
出于某种原因,user.email 或其许多变体(如 {{request.user.email}} )在此模板中不起作用。但是,它在所有其他模板中工作得非常好。是否与我的视图取消传递 RequestContext 信息有关?
此外,如果您看到我犯了任何其他可以修复的愚蠢错误,请提前致谢。
您不应该在您的视图中使用 render_to_response
。那不 运行 上下文处理器,因此不添加请求或用户变量。使用 render
代替:
return render(request, 'profile.html', args)
另请注意,CSRF 将由上下文处理器添加,因此无需像您那样手动添加。