Backend/Python

[인스타그램 클론] 프로필 페이지

비비빅B 2020. 4. 28. 22:49

model

from django.db import models
from django.conf import settings
from django.shortcuts import resolve_url
from django.utils.text import slugify	#라이브러리

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    nickname = models.CharField(max_length=20)
    profile_photo = models.ImageField(upload_to="profile/" , blank=True)
    slug = models.SlugField(blank=True, null=True)
 
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.nickname)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return resolve_url("accounts:profile", self.slug)
  • django User 모델 사용 중
  • 일대일관계로 모델 연결
  • 닉네임을 slug로 만들어서 url로 쓸 것임

url

path("profile/<slug:slug>/", views.ProfileView.as_view(), name="profile"),
  • 파라미터 slug를 view로 넘겨줌
  • 이 주소로 request하면 ProfileView 실행

view

class ProfileView(DetailView):
    template_name = "registration/profile.html"
    model = User
    context_object_name = 'profile_user'

    def get_object(self, queryset=None):
        slug = self.kwargs["slug"]
        p_obj = Profile.objects.get(slug=slug)
        d_obj = User.objects.get(profile=p_obj)
        return d_obj
  • generic DetailView 사용
  • User 클래스의 object(user)와 헷갈리지 않게 profile_user로 이름 지정
  • 클래스뷰의 get_object 오버라이딩
  • self.kwargs로 url에서 넘겨준 변수 "slug" 받은 후 대입
  • slug를 이용해 Profile 모델에서 원하는 데이터 추출
  • User모델의 profile과 비교해서 원하는 값 추출
  • 원하는 User 객체 반환

html

<a href="{% url 'accounts:profile' user.profile.slug %}">profile</a>
  • app_name = "accounts"
  • 일대일관계에서 related_name이 없으면 장고는 클래스명을 lower()함
  • 따라서 profile의 slug 객체에 접근하기 위해서는 user.profile.slug 쓰면 됨

마주한 오류

  • ProfileView는 모델이 User 이기 때문에 slug 객체가 없음
  • slug는 Profile모델에 있음