☝🏻 room에 비밀번호 설정하기
1. 룸(게시글) 모델 수정하기
# 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_count = models.PositiveIntegerField(default=0) #좋아요
room_password = models.CharField(max_length=5, default=None, null=True, verbose_name="방비밀번호") #방비밀번호
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_password = models.CharField(max_length=5, default=None, null=True, verbose_name="방비밀번호") #방비밀번호
- max_length=5 / 5글자까지
- default=None /
- null=True / https://wayhome25.github.io/django/2017/09/23/django-blank-null/
python manage.py makemigrations
python manage.py migrate
2. 템플릿 수정
자바스크립트를 사용해 input 박스에 숫자만 입력되도록 설정 - oninput 이벤트, 정규식, replace() 함수 활용
https://hianna.tistory.com/413
#room/room_add.html
...
<div>
<label for="room_password">비밀번호</label>
<input type="text" name="room_password" id="room_password" placeholder="숫자 5글자"
oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />
...
#room/room_edit.html
...
<label for="content">방 비밀번호</label><br>
<input type="text" name="room_password" id="room_password" placeholder="*****"
oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />
</div>
...
<input type="submit" value="수정하기" class="joinBtn text-white bg-gradient-to-r from-cyan-500 to-blue-500 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-cyan-300 dark:focus:ring-cyan-800 font-medium rounded-full text-sm px-5 py-2.5 text-center mr-2 mb-2"></a>
<button type="button">
<a href="/" class="text-white bg-gradient-to-r from-cyan-500 to-blue-500 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-cyan-300 dark:focus:ring-cyan-800 font-medium rounded-full text-sm px-5 py-2.5 text-center mr-2 mb-2">뒤로가기</a>
</button>
...
3. views.py
- 글 쓰기 함수
#room/views.py
#글쓰기추가 -> 이 부분은 method로 post인지 get인지 구분하여 if문으로 제어
@login_required
def room_add(request):
if request.method == 'POST': # post요청일 경우 if문 실행
title = request.POST.get('title', None)
sub_title = request.POST.get('sub_title', None)
content = request.POST.get('content', None)
room_password = request.POST.get('room_password', None)
room_owner = request.user
if not title:
return render(request, 'room_add.html', {"error" : "제목을 입력 해주세요"})
if not sub_title:
return render(request, 'room_add.html', {"error" : "부제목을 입력 해주세요"})
if not content:
return render(request, 'room_add.html', {"error" : "내용을 입력 해주세요"})
if not room_password:
return render(request, 'room_add.html', {"error" : "방 비밀번호를 입력 해주세요"})
if len(room_password) != 5:
return render(request, 'room_add.html', {"error" : "방 비밀번호는 숫자 5글자로 설정해주세요"})
if (title and sub_title and content and room_password):
PostingObj = Room()
PostingObj.title = title
PostingObj.sub_title = sub_title
PostingObj.content = content
PostingObj.room_owner = room_owner
PostingObj.room_password =room_password
PostingObj.save()
return redirect('home')
else:
return render(request, 'room_add.html', {"error" : "에러발생 모든 내용을 입력 해주세요"})
elif request.method == 'GET':
return render(request, 'room_add.html')
- 글 수정 함수
# 글 수정
@login_required
def room_edit(request,pk):
res_data = {}
try:
posts = Room.objects.get(pk=pk)
except:
return render(request, 'room_edit.html', {'error' : "게시글이 없습니다 해킹하지마세요 ㅡㅡ"})
# print(posts)
user = request.user # 현재 로그인되어있는 유저
room_owner = posts.room_owner # 포스팅 작성한 유저
res_data['room_owner'] = room_owner
if user == room_owner:
if request.method == 'POST':
res_data['posts'] = posts
title = request.POST['title']
sub_title = request.POST['sub_title']
content = request.POST['content']
if not title:
res_data['error'] = "제목을 입력 해주세요"
if not sub_title:
res_data['error'] = "부제목을 입력 해주세요"
if not content:
res_data['error'] = "내용을 입력 해주세요"
if (title and sub_title and content): #모두 입력했을 때
if request.POST['room_password'] == posts.room_password:
posts.title = title
posts.sub_title = sub_title
posts.content = content
posts.save() #저장
return redirect('home') #메인화면으로
else:
res_data['error'] = "방 비밀번호가 일치하지 않습니다."
else:
res_data['error'] = "에러발생 모든 내용을 입력 해주세요"
return render(request, 'room_edit.html', res_data)
elif request.method == 'GET':
res_data['posts'] = posts
return render(request, 'room_edit.html', res_data)
else:
return render(request, 'main.html', {"error" : "권한이 없습니다."})
- 글삭제
# 글 삭제
@login_required
def room_delete(request, pk):
res_data = {}
posts = Room.objects.get(pk=pk)
if request.method == 'POST':
room_password = request.POST['room_password']
if room_password == posts.room_password:
posts.delete() #삭제
res_data['error'] = "룸이 삭제 되었습니다."
return redirect('home')
else:
res_data['error'] = "방 비밀번호가 일치하지 않습니다."
return render(request, 'room_delete.html', res_data)
'FrameWork > Django' 카테고리의 다른 글
8월 9일(월) (0) | 2022.08.10 |
---|---|
8월 5일(금) 마이프로필 수정하기(자기소개) (0) | 2022.08.05 |
8월 1일(월) 질문 (0) | 2022.08.01 |
7월 27일(수) 게시글 작성자 (0) | 2022.07.28 |
7월 25일(월) 글삭제/글수정 (0) | 2022.07.26 |