【问题标题】:How to link to other user's profile in django?如何在 django 中链接到其他用户的个人资料?
【发布时间】:2020-08-09 13:42:16
【问题描述】:

我一直在尝试的是单击帖子的作者(创建帖子的用户)我希望它将我重定向到该用户的个人资料,例如在 Instagram 中,当您单击帖子顶部的用户时-它会将您重定向到他们的个人资料。每次我这样做而不是看到帖子的作者个人资料时,我都会看到登录的用户个人资料。我认为views.py 文件或base.html 中有问题。

views.py

    def profile(request, pk=None):
        if pk:
            user = get_object_or_404(User, pk=pk)
        else:
            user = request.user
        args = {'user': user}
        return render(request, 'profile.html', args)

    def home(request):
        created_posts = Create.objects.all().order_by("-added_date")
        return render(request, 'base.html', {"created_posts": created_posts})

    def create(request):
        if request.method == 'POST':
            created_date = timezone.now()
            header1 = request.POST['header']
            content1 = request.POST['content']
            user = request.user
            created_obj = Create.objects.create(added_date=created_date, title=header1, content=content1, user=user)
            created_obj.save()
            print('create created')
            return redirect('home')
        else:
            print('create not created')
            return render(request, 'create.html')

models.py

    class Create(models.Model):
        added_date = models.DateTimeField()
        title = models.CharField(max_length=200)
        content = models.CharField(max_length=200)
        user = models.ForeignKey(User, related_name='user', on_delete=models.CASCADE, default=1)

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

urls.py

    urlpatterns = [
        path('', views.home, name='home'),
        path('profile', views.profile, name='profile'),
        path('profile/<int:pk>/', views.profile, name='profile_pk'),
        path('create', views.create, name='create'),
    ]

profile.html(显示用户的个人资料)

    {% extends 'home.html' %}
    {% block body%}
    <div class="content-section">
      <div class="media">
        <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
        <div class="media-body">
          <h2 class="account-heading">{{ user.username }}</h2>
          <p class="text-secondary">{{ user.email }}</p>
        </div>
      </div>
    </div>
    {% endblock %}

base.html(使用用户名显示所有用户的帖子)

    {% extends 'home.html' %}
    {% block body %}
      <ul action="{% url 'create' %}" class="container-sm list-group" style="margin-top: 200px;">
        {% for created_post in created_posts %}
        <li class="list-group-item">{{ created_post.title }}
          <a href="{% url 'profile_pk' pk=user.pk %}">{{ created_post.user }}</a>
          <p>{{ created_post.content }}</p>
          <div class="float-right">
            <form action="delete_create/{{ created_post.id }}/" action="post">
              <button type="submit" class="btn btn-outline-danger btn-sm">Delete</button>
            </form>
          </div>
          <div class="float-right">
            <a href="{% url 'edit' created_post.id %}" class="btn btn-outline-warning btn-sm" style="margin-right: 5px;" role="button">Edit</a>
          </div>
        </li>     
       {% endfor %}            
     </ul>
     {% endblock %}

home.html(显示登录用户的导航栏)

    <body>
<nav class="navbar navbar-expand-md fixed-top navbar-dark" style="background-color: rgba(0, 0, 0, 0.712);">
    <div class="container">
      <a class="navbar-brand" href="/">
        <img src="static/style/images/logowebdev-png.png" alt="logo" style="width: 60px; height: auto;">
      </a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExample07" aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarsExample07">
        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
          <li class="nav-item">
            <a class="nav-link"  style="margin-left: 30px;" href="/">Home <span class="sr-only">(current)</span></a>
          </li>
          <li class="nav-item">
            <a class="nav-link"  style="margin-left: 30px;" href="/profile">profile</a>
          </li>
          <li class="nav-item">
            <a class="nav-link"  style="margin-left: 30px;" href="#">Pricing</a>
          </li>
        </ul>
        <ul class="navbar-nav ml-auto">
          {% if user.is_authenticated %}
          <div class="float-right">
              <li class="nav-item active">
                  <a class="nav-link" href="#">New post</a>
              </li>
          </div>
          <div class="float-right">
            <li class="nav-item active">
              <a class="nav-link" href="">{{ user.username }}</a>
            </li>
          </div>
          <div class="float-right">
            <li class="nav-item">
              <a class="nav-link" href="/logout">Logout</a>
            </li>
          </div>
          {% else %}
          <div class="float-right">
            <li class="nav-item">
              <a class="nav-link" href="/login">Login</a>
            </li>
          </div>
          <div class="float-right">
            <li class="nav-item">
              <a class="nav-link" href="/register">Register</a>
            </li>
          </div>
          {% endif %}
        </ul>
      </div>
    </div>
  </nav>
  {% block body %}

  {% endblock %}
</body>

【问题讨论】:

  • 找到解决方案的一种简单方法是使用调试器查看您在views.py 中收到的pk 的值。
  • @ansuman 如何使用调试器?
  • 插入import pdb; pdb.set_trace()你想暂停执行的地方,检查你的终端应该有这样的-&gt; (Pdb) 输入pk。它应该向您显示收到的 pk 值。
  • 请注意,这是 python 调试器仅适用于 python 文件,因为有多种调试方式,例如使用 IDE:stackoverflow.com/questions/1118183/…
  • @ansuman 当我放 pk 时它给了我这个错误 *** NameError: name 'pk' is not defined

标签: python html django django-models django-views


【解决方案1】:

在您的base.html 文件中更改

&lt;a href="{% url 'profile_pk' pk=user.pk %}"&gt;{{ created_post.user }}&lt;/a&gt;

&lt;a href="{% url 'profile_pk' pk=created_post.user.pk %}"&gt;{{ created_post.user }}&lt;/a&gt;

因为,您必须将帖子所有者的 id 传递给您的视图。当您只使用用户时,django 会检测经过身份验证的用户对象。

【讨论】:

  • 嘿,你的代码帮助我解决了我的问题,但现在在 home.html 上,我有一个导航栏,当我点击帖子的用户名时,它会显示登录的用户名,用户名在导航栏也发生了变化,但登录的用户仍然是一开始就登录的用户,那么我该怎么做才能解决这个问题?如果您不理解我的问题,请告诉我。
  • 对不起,我想我没有理解正确,你能举例解释一下吗?
  • 当然,假设您在 facebook 上并且您已登录,您可以在导航栏的右上角看到您的个人资料图片,当您转到其他用户的个人资料时,您仍然可以看到您的导航栏中的个人资料图片和您在正文中选择的用户个人资料对吗?
  • 可以说您在我的导航栏中的个人资料图片更改为您在正文中看到的用户,但请考虑到您的用户仍在登录,这意味着您在导航栏中看到的内容您正在检查其他用户的个人资料是其他用户的用户名
  • 这里的目标是在导航栏中只显示登录的用户而不是正在检查的用户。
猜你喜欢
  • 2020-09-17
  • 2014-10-09
  • 1970-01-01
  • 2012-01-20
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多