Пользовательские поля не отображаются в некоторых шаблонах

Я использую расширенную пользовательскую модель от 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?

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам