簡體   English   中英

Django:按用戶+ UserProfile 數據過濾帖子

[英]Django : Filtering Post by user + UserProfile data

我希望你很好。 我收到一個錯誤: name 'username' is not defined我想要一個包含用戶 slug 的公共頁面。

前任。 profile/louis/ 路易斯的帖子 + 路易斯的 UserProfileData

我從 Django 開始,所以我犯了一些錯誤。

nutriscore/models.py

class Post(models.Model):
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')

用戶/模型.py

class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)

用戶/視圖.py

#public profile        
@login_required(login_url='/earlycooker/login')
def userpublicpostview(request, slug):
    template = 'user_public_profile.html'
    user = User.objects.filter(username).values()
    user_id = user[0]['id'] 
    userprofile = UserProfile.objects.filter(user_id=userprofile).values()  
    user_post = Post.objects.filter(author = user_id, slug=slug) 
    return render(request, template, {'user_posts':user_posts,'userpublic': userpublic})

用戶/網址.py

path('profile/<slug:slug>/', userpublicpostview,name="user_public_cookwall"),

使用這些行:

user = User.objects.filter(username=slug).values()
...
userprofile = UserProfile.objects.filter(user_id=user_id).values()  
user_post = Post.objects.filter(author = user_id)  # removed slug from here
...
return render(request, template, {'user_posts':user_posts,'userpublic': userprofile})

一個高效的版本

看法

from django.shortcuts import get_object_or_404

@login_required(login_url='/earlycooker/login')
def userpublicpostview(request, slug):
    template = 'user_public_profile.html'
    user = get_object_or_404(User.objects.prefetch_related('blog_posts'), username=slug)
    return render(request, template, {'current_user':user})

模板

# user profile information

{{ current_user.userprofile.bio }}
{{ current_user.userprofile.profile_pic }}

# posts

{% for post in current_user.post_set.all %}
  {{ post.title }}
{% endfor %}

你可以在這里看到我可以通過current_user.userprofile訪問 Profile 信息,因為模板中的User模型和UserProfile模型之間存在OneToOne關系。 其次,我可以通過反向查詢current_user.post_set.all並遍歷帖子來訪問給定用戶的所有帖子。 更多關於反向關系(相關對象)的信息可以在文檔中找到。

您可以簡化您的代碼:

from django.shortcuts import get_object_or_404

@login_required(login_url='/earlycooker/login')
def userpublicpostview(request, slug):
    user = get_object_or_404(User.objects.select_related('userprofile'), username=slug)
    posts = Post.objects.filter(author_id=user.id) 
    return render(request, 'user_public_profile.html', {
        'user_posts': posts,
        'userpublic': user.userprofile
    })

在您的 html 中,以這種方式顯示帖子:

{% for post in user_posts %}
    <a href=‘{% url ‘user:user_public_cookwall’ post.author.slug %}’>{{ post.title }}</a>
{% endfor %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM