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모델에 있음
'Backend > Python' 카테고리의 다른 글
[인스타그램클론] 폼 에러메시지 표시 (0) | 2020.07.18 |
---|---|
[인스타그램 클론] 단일 페이지에 모델 폼 추가하기 (0) | 2020.06.17 |
[인스타그램 클론] Vanilla JS - AJAX (0) | 2020.06.08 |
중복값 갯수(collections.Counter) (0) | 2020.05.02 |
form 이미지 업로드 (0) | 2020.04.22 |