8월 4일(목) 게시글 비밀번호 만들기
☝🏻 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/
(번역) Django Tips #8 Blank or Null? · 초보몽키의 개발공부로그
(번역) Django Tips #8 Blank or Null? 23 Sep 2017 | django model blank field migration 장고를 공부하면서 많은 도움을 받고 있는 simple is better than complex의 Django Tips #8 Blank or Null? 번역글입니다. 기분좋게 선뜻 번역
wayhome25.github.io
python manage.py makemigrations
python manage.py migrate
2. 템플릿 수정
자바스크립트를 사용해 input 박스에 숫자만 입력되도록 설정 - oninput 이벤트, 정규식, replace() 함수 활용
https://hianna.tistory.com/413
[Javascript] input 박스에 숫자만 입력되도록 설정하는 4가지 방법
input 박스에서 사용자에게 숫자만 입력되도록 설정하는 방법 4가지를 소개합니다. input 박스에 숫자만 입력되도록 설정하는 4가지 방법 1. 'type'을 'number'로 지정하기 2. 입력된 keycode 체크하기
hianna.tistory.com
#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)