Django: фильтрация сообщений по данным user UserProfile

#python #django

#python #django

Вопрос:

Надеюсь, у тебя все хорошо. Я получил ошибку: name 'username' is not defined Я хотел бы иметь общедоступную страницу с пользовательским slug.

Например. profile/louis/ Сообщение Луи Пользовательские данные Луи

Я начинаю с Django, поэтому допустил некоторую ошибку.

nutriscore/models.py

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

user/models.py

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

user/views.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})
  

user/urls.py

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

Ответ №1:

Вы можете упростить свой код :

 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=‘{% urluser:user_public_cookwallpost.author.slug %}’>{{ post.title }}</a>
{% endfor %}
  

Комментарии:

1. спасибо за ваш ответ 🙂 но я получил это: объект ‘QuerySet’ не имеет атрибута ‘user’

2. Большое спасибо, брат, ты мне очень помог 🙂 не могли бы вы рассказать, какой бализ мне нужно использовать для отображения сообщения на user_public_profile.html ?

3. Если я хочу отобразить ссылку на профиль пользователя. Например, из сообщения (часть автора: {{ post.author }} ). Я использую это в ссылке {% url ‘user:user_public_cookwall’ %}, но что-то не так… Обратный для ‘user_public_cookwall’ без найденных аргументов. попробовано 1 шаблон (ы): [‘earlycooker/profile/(?P<slug>[-a-zA-Z0-9_] )/$’]

4. круто, что этот код работает: {% url ‘user:user_public_cookwall’ slug=post.author.userprofile. ошибка %}

Ответ №2:

Используйте эти строки:

 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 из-за однозначного отношения между User моделью и UserProfile model в шаблоне. Во-вторых, я могу получить доступ ко всем сообщениям данного пользователя, выполнив обратный запрос current_user.post_set.all и выполнив итерацию по сообщениям. Более подробную информацию об обратном отношении (связанных объектах) можно найти в документации.

Комментарии:

1. спасибо, Руддра, по-видимому, я допустил еще одну ошибку в отношении UserProfile: локальная переменная ‘userprofile’, на которую ссылаются перед назначением

2. Я обновил ответ, но я не уверен, что это то, чего вы хотели достичь

3. Я хотел бы иметь slug для пользователя 🙂 profile/<slug:slug>/’ нравится profile /louis / или profile / fredo/

4. Пользовательская ошибка отображение данных из профиля пользователя: Например, profile /louis/ Я хочу отобразить сообщение Луи и данные профиля пользователя Louis, например, profile / fredo / Я хочу отобразить данные Post Фредо и профиля пользователя Фредо

5. Я думаю, вы можете значительно сократить код. Я добавил эффективную реализацию представления.