삼일간의 짧지만 개 깊었던 슬럼프를 넘긴 후(넘긴건가 모르겠다 넘긴건 아니고 생활리듬이나 마음가짐 안바꾸면 난 계속 이렇게 쓰레기 같은 삶을 영위하겠지..^^;;;) 그래도 내가 말해둔게 있으니까 주말동안에 선택구현은 해야지 생각하고
게시판 CRUD, 댓글 CRUD, USER 관련 기본 회원가입, 로그인, 로그아웃만 되어있는 상황에서 프로필을 넣도록 결심했다.
프로필이 사실 젤 쉬울 줄 알았는데 지금 사진이 저장이 안된다. 일단 다른 걸로 넘어가기 위해서 프로필을 정리한다.
일단은 사실 프로필을 쉽게 하려면 장고에 내장되어있는 AbstractUser를 바꾸고 그러면 된다고 하는데 나는 그런거 모른다 구글링으로 살아는 가지만 아직 안배운 개념은 넘겨보고(그런데 사실 쓰고 있는거 있어서 이쯤되면 나 좋을대로 하고 있다 구현만 되면 되는거 아닐까유?ㅎ) 있는 거에서 어떻게든 지지고 볶고 해보겠다 이거에요
일단 모델부터 작성해보자
models.py
from django.db import models
from django.conf import settings
# Create your models here.
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
nickname = models.CharField(max_length=10)
bio = models.TextField(blank=True)
picture = models.ImageField(blank=True, upload_to="media/images/%Y/%m")
birthday = models.DateField(auto_now=False)
blog_url = models.URLField(max_length = 60, blank=True)
이러고 admin에 저장해주는데 하나의 user에 하나의 profile이 있기 때문에 user와 연결시켜주었다.
admin.py
from django.contrib import admin
from django.contrib.auth.models import User
from .models import Profile
from django.contrib.auth.admin import UserAdmin
# Register your models here.
class ProfileAdmin(admin.StackedInline):
model = Profile
con_delete = False
class CustomUserAdmin(UserAdmin):
inlines = (ProfileAdmin,)
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
유저어드민에 프로필을 넣어준다!
그리고 이미 User는 자동으로 등록되어있는 부분이니까 한번 unregister를 해준 후에 넣어주기..
이렇게 하면 admin사이트에서 user 클릭을 하면 profile이 보여진다 이렇게!
forms.py
사실 dateField는 위젯으로 꾸며줘야 쓸 수 있지만 일단은 데이터 연결이 목적인 저는 일단 기본만 해보겠다 이겁니다. 지금 모..사진도 저장 안되는 마당에 제가 뭘 어떻게 할 수 있겠습니꽈...배째세요......(슬럼프가 깊다 슬럼프가 아니고 사실 인성문제인건가 싶은 생각이 시작되었다ㅎ_ㅎ)
from django import forms
from .models import Profile
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['nickname', 'bio', 'birthday', 'picture', 'blog_url']
나는 처음 회원가입을 하면 바로 프로필을 작성할 수 있도록 했고, 마이페이지 속 프로필 수정 페이지를 넣고 싶었기 때문에 추가해 줄 페이지가 총 세 개 있었다.
urls.py
from django.urls import path
from . import views
app_name = 'community'
urlpatterns = [
path('', views.review_list, name = 'review_list'),
path('create/', views.create, name = 'create'),
path('<int:review_pk>/', views.detail, name = 'detail'),
path('<int:review_pk>/update/', views.update, name = 'update'),
path('<int:review_pk>/delete/', views.delete, name = 'delete'),
path('<int:review_pk>/comments/', views.comments_create, name = 'comments_create'),
path('<int:review_pk>/comments/<int:comment_pk>/delete/', views.comment_delete, name='comment_delete'),
]
views.py는 사실 단순한 CRUD니까, (D는 심지어 없음) 설명 생략!
def mypage(request, pk):
user = User.objects.get(pk=pk)
if user.profile:
profile = user.profile
context = {'profile':profile}
return render(request, 'accounts/mypage.html', context)
else:
return redirect('accounts:profile_create', user.pk)
@login_required
def profile_create(request):
if request.method == 'POST':
form = ProfileForm(request.POST)
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
messages.add_message(request, messages.INFO, 'Welcome!! Now you can enjoy our community!')
return redirect('community:review_list')
else:
form = ProfileForm()
context = {
'form' : form
}
return render(request, 'accounts/profile_form.html', context)
@login_required
def profile_update(request):
user = get_object_or_404(User, pk=request.user.pk)
if request.method == 'POST':
form = ProfileForm(request.POST, instance=request.user.profile)
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
return redirect('accounts:mypage', user.pk)
else:
form = ProfileForm( instance=request.user.profile)
context = {
'form' : form
}
return render(request, 'accounts/profile_form.html', context)
추가해준 부분이다!
처음에 update는 게시글 수정처럼 if profile.user == request.user:
이런 식으로 하려고 했는데 그냥 프로필 수정 버튼 자체를 내가 그 사람일때만 보여주는 걸로 변경하니까 view가 훨씬 깔꼼해졌다.
그리고 profile_forms.html과 mypage.html을 이용해서 페이지를 꾸며준 결과
그럼 바로 프로필 작성화면으로 넘어간다! (제목 크리피 실화냐...one..of...us...)
지금 생각하면 nickname 중복 안되게끔 처리 해줬어야 했던것도 같다.
회원가입이 완료 되면 메인 화면으로 간다
그리고 마이페이지를 들어가보면
크기별 반응형이다.
아니 그런데 여기서 문제가 발생했다.
나는 분명 내 증명사진을 넣었는데 저장과 불러오는 방법이 뭔가가 잘못된것 같다
저 머리털 세개난 default 그림이 뜬다. 그런데 일단 나머지 선택 구현 항목들을 구현해보고 .. 그리고 할래
'웹 프로그래밍 > Django' 카테고리의 다른 글
[내가 막 하는 장고 구현] 2. 조회수 (0) | 2020.04.26 |
---|---|
Django 총정리 1 (웹 프레임워크란, MTV패턴, startproject 설정) (0) | 2020.04.19 |
댓글