☝🏻 포스팅 가입하기
포스팅 작성자가 아닐 시
포스팅 상세페이지에 <가입하기> 버튼이 보이며
버튼을 누를 시, 가입하기 페이지로 이동 (http://127.0.0.1:8000/room/join/<iny:pk>)
- 가입 인사 메세지 란에 작성 후 <가입하기>버튼을 누르면
"가입이 되었습니다."라는 문구 띄우고, 포스팅 상세페이지로 이동
- 작성하지 않고 가입하기 눌렀을 경우 "가입 인사를 작성해주세요" 문구 띄우고, 포스팅 상세페이지로 이동
또 마이페이지에서 (http://127.0.0.1:8000/mypage/)
< 관심 스터디 목록 / 가입한 스터디 목록 > 버튼을 누르면
그에 맞는 데이터를 가져오게 하려면
그러면 core의 User모델에 like_post(관심목록) / join_room(가입목록) 추가하고, (아직 마이그레이션 안함)
room의 room 모델에 like_post , join_room 를 어떻게 정의해야할지 ㅠ 모르겠어요
이 문제는 포스팅 가입하기 기능 구현 후 문제인거 같은데
둘 중 하나에서 상대방을 참조하는 필드를 만들고 ManyToManyField를 정의하면 된다는 블로그 봤는데 지금 제 상황에서 User 와 room 을 서로 참조해야되는 건지 아니면 room과 또 다른 모델을 만들어야되는건지 ...(예를 들어 room_user 함수를 새로 만들기..? (포스팅 페이지에서 유저 목록 관련된 함수))
https://velog.io/@jiffydev/Django-9.-ManyToManyField-1
- core/models.py
from django.db import models
# 유저 필드 함수
class User(AbstractUser):
username = models.CharField(max_length=10, blank=False, null=False, unique=True, verbose_name="회원아이디") # 아이디
nickname = models.CharField(max_length=10, blank=False, null=False, unique=True, verbose_name="닉네임")# 닉네임
name = models.CharField(max_length=10, blank=False, null=False, verbose_name="회원이름") #이름
bio = models.TextField(verbose_name='자기소개') # 바이오
# like_posts = models.ManyToManyField('Room', blank=True, related_name='관심 목록') # 관심 목록
# join_room = models.ManyToManyField('Room', blank=True, related_name='가입 목록') # 가입 목록
create_at = models.DateTimeField(verbose_name='date joined', auto_now_add=True) # 가입한 날짜
last_login = models.DateTimeField(verbose_name='last login',auto_now=True) # 마지막 로그인
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
# api_key = models.UUIDField(default=uuid.uuid4)
object = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['name','nickname']
def __str__(self):
return self.username
class Meta:
db_table = 'accounts'
verbose_name = "가입자 목록"
verbose_name_plural = "가입자 목록"
- room/models.py
from django.db import models
from core.models import User
from django.conf import settings
class Room(models.Model):
title = models.CharField(max_length=50, verbose_name="제목") #제목
sub_title = models.CharField(max_length=100, blank=True, verbose_name="부제목") #부제목
content = models.TextField(verbose_name="내용") #콘텐츠
create = models.DateTimeField(verbose_name='작성일', auto_now_add=True) #작성일
# like_post = models.PositiveIntegerField(default=0) #관심수
room_owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, verbose_name="방장") #방장
join_user= models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='join_user',verbose_name="가입한 유저") #가입한 유저
def __str__(self):
return f'[{self.id}] {self.title} / {self.create}' # id=id
def get_absolute_url(self): #어드민에서 게시글 바로 볼 수 있음
return f'room/page/{self.id}'
class Meta:
verbose_name = "room 목록"
verbose_name_plural = "room 목록"
- room/urls.py
from django.urls import path
from . import views
urlpatterns = [
...
path('room/join/<int:pk>',views.room_join, name="room_join"), #가입
]
- room/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from room.models import Room
# 가입하기
@login_required
def room_join(request, pk):
res_data = {}
posts = Room.objects.get(pk=pk)
user = request.user # 현재 로그인되어있는 유저
# res_data = { 'posts': posts }
if request.method == 'POST':
res_data['posts'] = posts
join_message = request.POST.get('message', None) #가입인사들어옴
print(join_message)
if not join_message:
res_data['error'] = "가입 인사를 작성해주세요."
if join_message:
# 여기서 막혔어요 ㅠ
elif request.method == 'GET':
return render(request, 'room_join.html')
return render(request, 'room_join.html', res_data)
'FrameWork > Django' 카테고리의 다른 글
8월 5일(금) 마이프로필 수정하기(자기소개) (0) | 2022.08.05 |
---|---|
8월 4일(목) 게시글 비밀번호 만들기 (0) | 2022.08.04 |
7월 27일(수) 게시글 작성자 (0) | 2022.07.28 |
7월 25일(월) 글삭제/글수정 (0) | 2022.07.26 |
7월 21(목) 작성자필드추가/마이페이지추가/회원만 글쓰기 (0) | 2022.07.22 |