0

I'm trying to add a user profile page into my blog (in German) but when I run the server and go to user profile page, it shows profiles of all users that are in the database.

I want to show only the profile of one user (the logged in one)

Here is my views.py:

...
class UserProfile(LoginRequiredMixin, ListView):
  model = Member
  template_name = "app/profile.html"
  context_object_name = "member_infos"
 

...

And my profile.html template:

...
{% for info in member_infos %}
   <div class="row">
     <div class="col-md-3">
       <div class="card card-body">
         <h3 style="text-align:center;">Profil</h3>
         <hr />
  {% if info.picture %}
         <img class="profile-pic" src="{{ info.picture.url }}" />
  {% else %}
        <img class="profile-pic" src="{% static 'media/images/profile_pic/default_profile_pic.png' %}" />
  {% endif %}
       </div>
     </div>
     <br /><br />
     <div class="col-md-9">
       <div class="card card-body">
         <p class="card-text"> <strong>Vorname(n): </strong> {{ info.first_name }} </p>
         <hr />
         <p class="card-text"> <strong>Nachname: </strong> {{ info.last_name }} </p>
         <hr />
         <p class="card-text"> <strong>Telefonnummer: </strong> {{ info.contact }} </p>
         <hr />
         <p class="card-text"> <strong>E-Mail-Adresse: </strong> {{ info.email }} </p>
       </div>
       <br /><br />
        <a class="btn btn-warning ml-7" href="{% url 'edit-profile' %}"> Daten bearbeiten  &rarr;</a>
     </div>
   </div>
 <br /><br />
 {% endfor %}
...

As I said, it shows up profiles of all users in my database.

How to fix it?

I need help please!

Edit: I already fixed that error/bug I removed simply my profile class in views.py and replace it with

@login_required
def userProfile(request):
  return render(request, "app/profile.html")

And because of the OneToOne relationship between User & Member, I was able to access data from that table and show up only the currently logged in user.

My Member class in models.py looks like:

# Member's model
class Member(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='User from database')
  first_name = models.CharField(max_length=255, null=True, blank=True, verbose_name='Vorname(n)')
  last_name = models.CharField(max_length=255, null=True, blank=True, verbose_name='Nachname')
  contact = models.CharField(max_length=255, null=True, blank=True, verbose_name='Telefonnummer')
  email = models.EmailField(unique=True, null=True, blank=True, verbose_name='E-Mail-Addresse')
  picture = models.ImageField(upload_to='media/images/profile_pic/%Y/%m/%d', blank=True, null=True, verbose_name='Profilbild', default='media/images/profile_pic/default_profile_pic.png')
  class Meta:
    verbose_name = 'Member'
    verbose_name_plural = 'Members'
  def get_absolute_url(self):
    return reverse('members', args=[self.slug])
  def __str__(self):
    return str(self.user)

My profile template (profile.html):

{% extends 'app/base.html' %}
{% load static %}

{% block title %}
  Profil • Deutsch
{% endblock %}


{% block extra_head %}
  <link rel="shortcut icon" href="{% static 'media/site/favicon.ico' %}" type="image/x-icon" />
  <style type="text/css" media="all">
    .profile-pic{
      max-width: 200px;
      max-height: 200px;
      margin: 0 auto;
      border-radius: 50%;
    }
    .ml-7{
      margin-left: 5rem !important;
    }
  </style>
{% endblock %}


{% block content %}

{% if request.user.is_authenticated %}
   <div class="row">
     <div class="col-md-3">
       <div class="card card-body">
         <h3 style="text-align:center;">Profil</h3>
         <hr />
  {% if user.member.picture %}
         <img class="profile-pic" src="{{ user.member.picture.url }}" />
  {% else %}
        <img class="profile-pic" src="{% static 'media/images/profile_pic/default_profile_pic.png' %}" />
  {% endif %}
       </div>
     </div>
     <br /><br />
     <div class="col-md-9">
       <div class="card card-body">
         <p class="card-text"> <strong>Benutzername: </strong> {{ user.username }} </p>
         <hr />
         <p class="card-text"> <strong>Vorname(n): </strong> {{ user.member.first_name }} </p>
         <hr />
         <p class="card-text"> <strong>Nachname: </strong> {{ user.member.last_name }} </p>
         <hr />
         <p class="card-text"> <strong>Telefonnummer: </strong> {{ user.member.contact }} </p>
         <hr />
         <p class="card-text"> <strong>E-Mail-Adresse: </strong> {{ user.member.email }} </p>
       </div>
       <br /><br />
        <a class="btn btn-warning ml-7" href="{% url 'edit-profile' %}"> Daten bearbeiten  &rarr;</a>
     </div>
   </div>
 <br /><br />
  {% endif %} <!-- if user logged in -->
{% endblock content %}

Thank you for your help! I already fixed it.

Stefan-ci
  • 3
  • 2
  • the currently logged in user is in `request.user` in the view and in the variable `user` in the template – Ralf Jan 22 '21 at 13:52
  • https://stackoverflow.com/questions/13713077/get-user-information-in-django-templates – Ralf Jan 22 '21 at 13:52
  • You are using ListView which represents the lists of objects. But for showing only one object you can use [DetailView](https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-display/#detailview). It's not possible to answer for me because it require many changes in your `view.py`, `urls.py` and in `profile.html`. – Mubashar Javed Jan 22 '21 at 14:13
  • Thank you @Mubashar but how can do that? Someone suggested that I add ```{% if request.user %} {% endif %}``` but it doesn't work. How can I fix this? – Stefan-ci Jan 22 '21 at 19:06

3 Answers3

0

You can use this :-

{% if request.user %}

{% for info in member_infos %}

  {% if info.picture %}
         <img class="profile-pic" src="{{ info.picture.url }}" />
  {% else %}
        <img class="profile-pic" src="{% static 
'media/images/profile_pic/default_profile_pic.png' %}" />
  {% endif %}
   </div>
     </div>
     <br /><br />
     <div class="col-md-9">
       <div class="card card-body">
         <p class="card-text"> <strong>Vorname(n): </strong> {{ info.first_name }} </p>
         <hr />
         <p class="card-text"> <strong>Nachname: </strong> {{ info.last_name }} </p>
         <hr />
         <p class="card-text"> <strong>Telefonnummer: </strong> {{ info.contact }} </p>
         <hr />
         <p class="card-text"> <strong>E-Mail-Adresse: </strong> {{ info.email }} </p>
       </div>
       <br /><br />
        <a class="btn btn-warning ml-7" href="{% url 'edit-profile' %}"> Daten bearbeiten  &rarr;</a>
     </div>
   </div>
 <br /><br />
 {% endfor %}
{% endif %}

Adding {% if request.user %} in template will check, if current user is request.user then show all the information of request.user. Then at the End use {% endif %}. That means you ended the if statement.

Lars
  • 1,234
  • 1
  • 8
  • 31
0

Try this:

class UserProfile(LoginRequiredMixin, ListView):
    model = Member
    template_name = "app/profile.html"
    context_object_name = "member_infos"

    def get_queryset(self):
        qs = super().get_queryset()
        # asuming your email field is unique
        return qs.filter(email=self.request.user.email)
Mubashar Javed
  • 1,197
  • 1
  • 9
  • 17
0

Try to use this :-

views.py

def profile_view(request):
    user = User.objects.filter(request.user)
Lars
  • 1,234
  • 1
  • 8
  • 31