Django - передача объекта в контексте для просмотра работает, но как пройти, чтобы включить? - PullRequest
0 голосов
/ 16 марта 2020

ОБНОВЛЕНО, СПАСИБО НА ОБРАТНУЮ СВЯЗЬ: я включаю шаблон, где у меня есть доступ к зарегистрированному пользователю, но я хотел бы иметь возможность доступа к соответствующей записи Person этого пользователя (связанной с моделью профиля, которую я создал для дополнительных полей) ), поэтому я могу показать небольшую ссылку на их страницу в верхней части навигации. Я могу получить эту запись Person для отдельных представлений в views.py, но моя top_nav. html (template или 'частичная' в мирах laravel / rails) включается без использования views.py, поэтому я не уверен, как получить / передать дополнительные элементы в шаблон без views.py (и не хочу повторять передачу человека в КАЖДЫЙ вид, включающий верхнюю навигацию). Я хотел бы иметь возможность добавить метод для пользователей, чтобы я мог получить к нему доступ как user.get_person, но расширение auth.User выглядит как кошмар.


Я создаю свое первое приложение Django. Я могу передать / получить доступ к переменной для пользователя запроса в одном представлении, но не в другом (частичном / шаблонном).

Подробности: у меня есть партиал для моей верхней панели навигации, где я хочу включить ссылку на «страницу человека» для вошедшего в систему пользователя. Я даже передаю пользователя, когда включаю это частичное представление, хотя я не уверен, как получить к нему доступ в views.py. В views.py я могу передать QuerySet для пользователя для представления person_index, используя request.user, но это не доступно в top_nav. Я не уверен, смогу ли я каким-то образом получить пользователя в views.py из него, когда я вызываю этот top_nav из базы. html?

Представление индекса личности настраивается следующим образом:

  • person_index. html расширяет базу. html
  • база. html включает top_nav . html
  • тогда «мясо» представления находится в {% содержании блока%}

См. Views.py ниже: я беру человека за person_index (face_link частично работает), но, очевидно, я не хочу получать / передавать его для КАЖДОГО вида, вместо этого я хочу сделать это один раз и иметь возможность передать его в top_nav. html.

views.py :

def person_index(request):
    accessible_branches = get_valid_branches(request)
    this_person = get_user_person(request.user).first()
    person_list = Person.objects.order_by('display_name') 
    context = { 'person_list': person_list,
                'accessible_branches':accessible_branches, 'this_person': this_person}
    return render(request, 'familytree/person_index.html', context)

def get_user_person(user):
    try:
        this_user_person = Person.objects.filter(profile__user_id=user)
    except Profile.DoesNotExist:
        this_user_person = None
    return this_user_person

top_nav. html: (Я хотел бы иметь возможность получить / передать запись о человеке)

<div class="container">
    <div id="navbar" class="collapse navbar-collapse">
    <ul class="nav navbar-nav">

        <a href="{% url 'dashboard' %}">Home</a>
        <a href="{% url 'family_index' %}">Families</a>
        <a href="{% url 'person_index' %}">People</a>
        {%  if this_person %}
            {% include "familytree/face_link.html" with person=this_person %}
        {% endif %}
    </ul>
    </div>
</div>

base. html: (пользователь запись доступна «бесплатно», необходимо получить соответствующий профиль__person)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>
        Our big family tree
           {% block title %}
           {{ page_title|default:"Untitled Page" }}
          {% endblock title %}
        </title>
    </head>

    <body>
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'familytree/style.css' %}">

{#    Top nav#}
    {% include "familytree/top_nav.html" with user=user %} <br/>

{#  Separator line#}
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-10">
                <hr class = "line" />
         </div>
        </div>
    </div>

{#  Page content#}
    <div class="container">
        {% block content %}
            <p>Placeholder text in base template- this gets replaced with page content.</p>
        {% endblock content %}
    </div>
    </body>
</html>

Есть ли что-то, что мне не хватает, чтобы правильно передать / получить пользователя для этого частичного включения? Есть ли правила о том, кто что может загрузить?

1 Ответ

0 голосов
/ 16 марта 2020

попробуйте таким образом

def top_nav(request):
    this_user_person = Person.objects.get(profile__user=request.user)
    context = { 'this_user_person': this_user_person}
    return render(request, 'familytree/top_nav.html', context)

в шаблонах, которые вы можете назвать

{{ this_user_person.first_name }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...