ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django user profile FBV
    Project using python/Cloning Airbnb 2021. 3. 4. 09:55

    url 설정

    config/urls.py

    urlpatterns = [
        path("users", include("users.urls", namespace="users")),
    ]

    users/urls.py

    from django.urls import path
    from . import views
    
    app_name = "users"
    
    urlpatterns = [path("<int:pk>/profile/", views.userDetail, name="profile")]
    

    {% url %}

      url template tag를 이용해서 user profile page로 갈 수 있게 한다. {% url 'users:profile' user.pk %}는 /users/<int:pk>/profile과 같다. 여기서 pk는 primary key 값으로 변수 값이다. urls.py에서 <int:pk>를 설정하였기 때문에 반드시 이에 해당하는 user.pk를 넘겨줘야 한다.

    FBV(Function Based View)

    users/views.py

      User Profile page에서는 사용자 정보와 사용자가 hosting한 rooms를 보여준다. 그래서 context로 user_obj와 rooms를 넘겨준다. 여기서 이름을 user가 아닌 user_obj로 한 이유는 어디서나 사용될 수 있는 context processor인 user와 중복되지 않기 위해서다. template를 보면 바로 확인할 수 있다.

    from django.shortcuts import render, redirect, reverse
    from django.core.paginator import Paginator
    from . import models
    
    @login_required
    def userDetail(request, pk):
        user_obj = models.User.objects.get_or_none(pk=pk)
        if user_obj is None:
            messages.error(request, "User does not exist")
            return redirect(reverse("core:home"))
    
        page = int(request.GET.get("page", 1))
        page_sector = ((page - 1) // 5) * 5
        qs = user_obj.rooms.all()
        paginator = Paginator(qs, 12, orphans=6)
        rooms = paginator.get_page(page)
    
        return render(
            request,
            "pages/users/userDetail.html",
            {"user_obj": user_obj, "page_sector": page_sector, "rooms": rooms},
        )
    

    templates

    pages/users/userDetail.html

    {% extends 'base.html' %}
    
    
    {% block page_title %}
      {{user_obj.first_name}}'s Profile
    {% endblock page_title %}
    
    {% block search-bar %}
    <div></div>
    {% endblock search-bar %}
    
    {% block content %}
      <div class="grid grid-cols-3 items-center px-16 mb-20">
        <div></div>
        <div class="profile w-full">
          <div class="profile__info">
            <div class="mb-4">
              {% include 'mixins/avatar.html' with user=user_obj %}
            </div>
            <div class="info">
              <h4>First name</h4>
              <span>{{user_obj.first_name|capfirst}}</span>
            </div>
            
            {% if user_obj.last_name %}
            <div class="info">
              <h4>Last name</h4>
              <span>{{user_obj.last_name|capfirst}}</span>
            </div>
            {% endif %}
              
            {% if user_obj.email %}
            <div class="info">
              <h4>Email</h4>
              <span>{{user_obj.email}}</span>
            </div>        
            {% endif %}
              
          </div>
          <div class="profile__info">
            {% if user_obj.gender %}
            <div class="info">
              <h4>Gender</h4>
              <span>{{user_obj.gender}}</span>
            </div>
            {% endif %}
              
            {% if user_obj.language %}
            <div class="info">
              <h4>Language</h4>
              <span>{{user_obj.language}}</span>
            </div>
            {% endif %}
              
            {% if user_obj.currency %}
            <div class="info">
              <h4>Currency</h4>
              <span>{{user_obj.currency}}</span>
            </div>
            {% endif %}
              
            {% if user_obj.birthdate %}
            <div class="info">
              <h4>Birthdate</h4>
              <span>{{user_obj.birthdate}}</span>          
            </div>
            {% endif %}
    
            {% if user_obj.superhost %}
            <div class="info">
              <h4>Superhost</h4>
            </div>
            {% endif %}
            
            {% if user_obj.bio %}
              <div class="info flex-col mt-3">
                <h4>Bio</h4>
                <div class="text-justify line-clamp-6 w-full">&emsp;{{user_obj.bio}}</div>
              </div>
            {% endif %}
          </div>
    
          {% if user_obj.pk == user.pk %}
            <button class="button my-6 w-3/4">
              <a href="#">Edit Profile</a>
            </button>
          {% endif %}
        </div>
      </div>
    
      <div class="flex flex-col items-center justify-items-center">
        <div class="w-10/12">
            {% include 'mixins/room_card.html' with rooms=rooms %}
            <div class="flex justify-center mt-20 itmes-center">
            {% include 'mixins/page_number.html' with page=rooms %}
          </div>
        </div>
      </div>
    {% endblock content %}

    mixins/avatar.html

      user.first_name|first|upper를 보자 (|)는 template filter라고 한다. |first는 첫 글자만 따오고, |upper는 앞에서 받은 input 값을 대문자로 변환한다. 즉, avatar image가 없을 경우 user의 fist_name의 대문자 첫글자를 따온다.

    {% if user.avatar %}
      <img src="{{user.avatar.url}}" class="img" alt="User avatar" title="User Avatar">
    {% else %}
      <div class="img">{{user.first_name|first|upper}}</div>
    {% endif %}

    참고 자료

    소스 코드

    github.com/zpskek/airbnb-clone-v3/commit/852e9bc43422e2723c1095618bb6388d107f5037

    'Project using python > Cloning Airbnb' 카테고리의 다른 글

    django Update Profile by FBV  (0) 2021.03.05
    django user profile CBV  (0) 2021.03.04
    django mailgun.com 연동(interlocking)  (0) 2021.03.04
    django kakao login  (0) 2021.03.03
    django managers.py  (0) 2021.03.03

    댓글

Designed by Tistory.