【问题标题】:how to display user profile data by id in django如何在 django 中按 id 显示用户配置文件数据
【发布时间】:2020-08-02 23:03:48
【问题描述】:

试图将个人资料的用户链接到他们在 django 中发布的帖子 类似 post.author.profile

这是我尝试过的:

views.py

def user(request, id):
if request.method == 'POST':
    r_form = upload_resume(request.POST, request.FILES, instance=request.user.profile)
    if r_form.is_valid():
        r_form.save()
        messages.success(request, f'your resume has been uploaded')
        return redirect('user')
else:
    r_form = upload_resume(instance=request.user)

context = {
    'r_form': r_form
}
return render(request, 'users/profile.html', context)

models.py

class profile(models.Model):
    user = models.OneToOneField(User,on_delete = models.CASCADE, related_name='profile')
    bio = models.TextField(blank=True)

urls.py

 path('user/<int:id>/', views.user, name='user')

最后是个人资料页面的 html

<div class="profile-card__name" style="color: #212f3c;">@{{user.get_username}}</div>
<div class="profile-card__txt"style="text-align: center;">last seen on {{user.last_login}}</div><br>
{%if user.first_name and user.last_name%}
<div class="text" style="font-size: 15px;display: flex;-webkit-box-align: center;-ms-flex-align: center;align-items: center;position: relative; align-items: flex-start;padding-left: 20px;"><img class="user_icons" src="{{object.profile.profile_pic.url}}" style="border-radius: 100%;height: 20px;width: 25px;"><b style="padding-left: 10px;">{{user.first_name}} {{user.last_name}}</b></div>
{%endif%}
{%if object.profile.bio%}
<div class="profile-card__txt" style="position: relative;align-items: flex-start;padding-left: 20px;"><b>About me:</b> {{object.profile.bio}}</div>
{%endif%}
{%if object.profile.current_location%}
<div class="text" style="font-size: 15px;display: flex;-webkit-box-align: center;-ms-flex-align: center;align-items: center;position: relative; align-items: flex-start;padding-left: 20px;"><img class="user_icons" src="{% static 'blog/location.svg'%}" style=" height: 25px;width: 25px;padding-right: 5px;"><b>{{object.profile.current_location}}</b></div>
{%endif%}

每当我去user/25/ 即使使用另一个用户的 id,它也会呈现当前登录用户的信息。我该如何解决这个问题。提前谢谢:)

【问题讨论】:

    标签: python django profile


    【解决方案1】:

    那么你使用request.user.profile,而不是profile 和给定的id。你可以使用get_object_or_404(…) [Django-doc]:

    from django.shortcuts import get_object_or_404
    
    def user(request, id):
        profileobj = get_object_or_404(profile, pk=id)
        if request.method == 'POST':
            r_form = upload_resume(request.POST, request.FILES, instance=profileobj)
            if r_form.is_valid():
                r_form.save()
                messages.success(request, f'your resume has been uploaded')
                return redirect('user', id=id)
        else:
            r_form = upload_resume(instance=profileobj)
    
        context = {
            'r_form': r_form,
            'object': profileobj.profile
        }
        return render(request, 'users/profile.html', context)

    注意:Django 中的模型是用 PerlCase 编写的,而不是 snake_case,因此您可能需要将模型从 profile 重命名为 Profile


    注意:通常FormModelForm…Form 后缀结尾, 避免与模型名称冲突,并明确表示我们是 使用表单。因此最好使用UploadResumeForm 而不是 upload_resume.

    【讨论】:

    • 您好,感谢您的回复@joe,我现在收到错误 Reverse for 'user' with arguments '('',)' not found。尝试了 1 种模式:['user/(?P[0-9]+)/$']
    • @jephthah:这是因为你 redirect('user') 没有通过 id。您可以将其更改为redirect('user', id=id)
    • Willem Van Onsem 已经更改了它。我仍然抛出相同的错误请帮助我.. 调用模板中的对象将是 {{profileobj.item}}
    猜你喜欢
    • 2016-02-16
    • 2015-08-10
    • 2021-09-07
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多