# 가장 가까운 같은 글자
# 문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
# 문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
# 내 코드
def solution(s):
answer = [-1]
for i in range(1,len(s)):
string = s[:i]
index = [j for j, c in enumerate(string) if c == s[i]]
if index == []:
answer.append(-1)
else:
answer.append(i - max(index))
return answer
# 푸드 파이트 대회
# 예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며,
# 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다.
# 따라서 1번 음식 1개는 대회에 사용하지 못합니다.
# 수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때,
# 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.
# 내 코드
def solution(food):
answer_l = ''
for i in range(len(food)):
if food[i] <= 1:
continue
else:
num = food[i] // 2
answer_l += str(i) * num # 0인 물을 기준은로 left구하고 뒤집어서 right로 붙임
answer_r = answer_l[::-1]
return answer_l + '0' + answ
# 콜라 문제
# 콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b,
# 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다.
# 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.
# 내 코드
def solution(a, b, n):
answer = 0
while n >= a:
r, c = divmod(n, a) # 지금 가진 콜라/마트 반납할 콜라
result = r * b # 돌려받은 콜라
answer += result # 실제 받은 콜라를 저장
n = c + result # 남은 콜라 + 돌려받은 콜라
return answer
오늘 진행 작업
- 기존 유저 모델 AbstractUser 확장
- 메인페이지 → 작성페이지 링크
- 작성페이지에서 장소이름, 내용, 사진 Post 기능 추가
- 이미지 추가/이미지 미리보기/미리보기 삭제 추가
- 메인에서 div 영역 클릭시 페이지 이동 하도록
app과 동일한 위치에 media 폴더 추가
settings.py에 경로 추가
import os
MEDIA\_URL = '/media/'
MEDIA\_ROOT = os.path.join(BASE\_DIR, 'media')
models.py 에 이미지 필드 정의
...
image = models.ImageField(upload_to="images/", blank=True, null=True)
view.py에 post 메소드 추가
...
mypost.image = request.FILES['image']
mypost.save()
# 이미지 공백 시 에러 발생 방지하고 싶다면 아래처럼
try:
mypost.image = request.FILES['image']
except:
mypost.image = None
# blank=True, null=True 값 줬는데 왜 안 되는지는 모르겠음...
makemigration, migrate
html 파일 수정
<form action="/경로/" method="post" enctype="multipart/form-data">
...
<input type="file" class="form-control" id="image" name="image">
<form method="post" enctype="multipart/form-data">
...
<h5 class="card-title"> 사진 추가 </h5>
<div class="input-group mb-3">
<!-- 이미지 추가 버튼 -->
<input type="file" class="form-control" id="image" name="image"
accept="image/*" onchange="loadFile(event)">
<!-- 이미지 삭제 버튼 - 기본적으로 display: none -->
<button type="button" id="delete_btn" class="btn btn-dark" style="display: none; border-radius: 0px 5px 5px 0px;">
X
</button>
</div>
<div class="mb-2">
<!-- 이미지가 보여질 곳 - 기본적으로 display: none -->
<img id="output" style="width: 600px; height: 400px; display: none;"/>
<script>
<!-- 이미지 미리보기 메소드 -->
var loadFile = function(event) {
var output = document.getElementById('output');
var d_btn = document.getElementById('delete_btn');
output.style.display = "";
d_btn.style.display = "";
output.src = URL.createObjectURL(event.target.files[0]);
output.onload = function() {
URL.revokeObjectURL(output.src)
}
};
<!-- 이미지 미리보기 삭제 메소드 -->
document.getElementById("delete_btn").onclick = function () {
var fileInput = document.getElementById('image');
var d_btn = document.getElementById('delete_btn');
var output = document.getElementById('output');
fileInput.value = '';
d_btn.style.display = 'none';
output.style.display = 'none';
};
</script>
</div>
AbstractUser 유저모델 확장
# user/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserModel(AbstractUser): # AbstractUser 기존 user 모델에 이미 정의된 필드 그냥 가져다 쓸 수 있음
class Meta:
db_table = "my_user"
setting.py에 AUTH_USER_MODEL추가
# setting.py
AUTH_USER_MODEL = 'user.UserModel'
터미널에서 마이그레이션
python manage.py makemigrations
python manage.py migrate
참고
https://ghqls0210.tistory.com/33
https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded