Невозможно отобразить имя пользователя в проекте Django - PullRequest
0 голосов
/ 06 августа 2020

Я мучился с отображением имени пользователя на страницах профилей пользователей в моем личном проекте. Следующее изображение - это вид, который я хотел бы дать. У него есть имя пользователя вверху и биография, за которой следуют сообщения от указанного c пользователя.

Вид, который я хочу дать

Однако на самом деле Я получаю следующее представление:

Вид, который я получаю

Как я могу добавить имя пользователя и биографию на страницу сообщений пользователя? Вот несколько файлов, которые, вероятно, связаны с этой проблемой:

user_posts. html:

<h1>{{ view.kwargs.username }}'s Profile</h1>
<p>{{ user.bio }}</p>
<h2 class="mb-3">Posts by {{ view.kwargs.username }} ({{ page_obj.paginator.count }})</h1>
{% for post in posts %}
    <article class="media content-section">
      <div class="media-body">
        <div class="article-metadata">
          <a class="mr-2" href="{% url 'situmon:user-posts' post.author.username %}">{{ post.author }}</a>
          <small class="text-muted">{{ post.published_posted|date:"F d, Y" }}</small>
        </div>
        <h2><a class="article-title" href="{% url 'situmon:post-detail' post.id %}">{{ post.title }}</a></h2>
        <p class="article-content">{{ post.content }}</p>
      </div>
    </article>
{% endfor %}

home. html:

{% for post in posts %}
        <article class="media content-section">
            <div class="media-body">
            <h2 class="article-title"><a href="{% url 'situmon:post-detail' post.id %}">{{ post.title }}</a></h2>
            <a href ="{% url 'situmon:user-posts' post.author.username%}">{{ post.author }}</a>
            <p class="article-content">{{ post.description }}</p>
                <div>
                    <!--
                    <time class="text-muted">
                        datetime="{{ post.updated_at | date:'Y-m-d' }}">{{ post.updated_at | naturaltime }}
                    </time>
                    -->
                    <!-- 
                    {% for tag in post.tags.all %}
                        <span class="tag" data-pk="{{ tag.pk }}">{{ tag.name }}</span>
                    {% endfor %}
                    -->
                </div>
            </div>
        </article>

urls. py:

from django.urls import path
from . import views

app_name = 'situmon'

urlpatterns = [
    path('user/<str:username>', views.UserPostListView.as_view(), name='user-posts'),
]

views.py:

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from users.models import CustomUser
from django.views.generic import (
    ListView,
    DetailView,
    CreateView,
    UpdateView,
    DeleteView
)
from .models import Post


def home(request):
    context = {
        'posts': Post.objects.all()
    }
    return render(request, 'situmon/home.html', context)

class UserPostListView(ListView):
    model = Post
    template_name = 'situmon/user_posts.html'
    context_object_name = 'posts'
    paginate_by = 10

    def get_queryset(self):
        user = get_object_or_404(CustomUser, username=self.kwargs.get('username'), )
        return Post.objects.filter(author=user).order_by('-id')

Скажите, пожалуйста, есть ли что-то, чего мне не хватает. Спасибо.

1 Ответ

0 голосов
/ 07 августа 2020

Вы должны добавить в представление get_context_data переопределение, чтобы вы могли предоставить всю необходимую информацию в своем шаблоне.

Например, вы пытаетесь выполнить {{ user.bio }} в шаблоне, но {{ user }} не передается в контекст, по крайней мере, из кода, которым вы поделились.

user_posts.html:

<h1>{{ user.username }}'s Profile</h1>
<p>{{ user.bio }}</p>
<h2 class="mb-3">Posts by {{ user.username }} ({{ page_obj.paginator.count }})</h1>
{% for post in posts %}
    <article class="media content-section">
      <div class="media-body">
        <div class="article-metadata">
          <a class="mr-2" href="{% url 'situmon:user-posts' post.author.username %}">{{ post.author.username }}</a>
          <small class="text-muted">{{ post.published_posted|date:"F d, Y" }}</small>
        </div>
        <h2><a class="article-title" href="{% url 'situmon:post-detail' post.id %}">{{ post.title }}</a></h2>
        <p class="article-content">{{ post.content }}</p>
      </div>
    </article>
{% endfor %}

views.py

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from users.models import CustomUser
from django.views.generic import (
    ListView,
    DetailView,
    CreateView,
    UpdateView,
    DeleteView
)
from .models import Post


class UserPostListView(ListView):
    model = Post
    template_name = 'situmon/user_posts.html'
    context_object_name = 'posts'
    paginate_by = 10

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        # this is initialised in dispatch()
        self.user = None

    def dispatch(self, request, *args, **kwargs):
        """
        Custom dispatch to set the user from the request
        """
        self.user = get_object_or_404(
            CustomUser, username=self.kwargs.get('username')
        )

        return super().dispatch(request, *args, **kwargs)


    def get_queryset(self):
        
        return Post.objects.filter(author=self.user).order_by('-id')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['user'] = self.user
        return context
...