[Linux]부트캠프 - 파일 및 폴더 생성
파일 및 폴더 생성
참고 : https://docs.djangoproject.com/en/4.0/topics/pagination/
views.py로 이동
# 모듈 호출
from django.core.paginator import Paginator
def index(request):
myboard = MyBoard.objects.all().order_by('-id')
# 페이지 당 몇개의 글을 보여줄 것인지 설정(5개)
paginator = Paginator(myboard, 5)
# 현재 페이지, 만약 없으면 1로 가져옴
page_num = request.GET.get('page','1')
# 페이지에 맞는 모델 가져오기(objects들을 queryset 형태로 반환)
page_obj = paginator.get_page(page_num)
# 관련 메서드
print(type(page_obj)) # <class 'django.core.paginator.Page'>
print(page_obj.count) # 총 객체수
print(page_obj.paginator.num_pages) # 총 페이지 개수
print(page_obj.paginator.page_range) # 페이지의 범위
print(page_obj.has_next()) # 다음 페이지가 존재 하는지 Bool
print(page_obj.has_previous()) # 이전 페이지가 존재 하는지 Bool
try:
print(page_obj.next_page_number()) # 다음 페이지 num
print(page_obj.previous_page_number()) # 이전 페이지 num
except:
pass
print(page_obj.start_index()) # 시작 페이지(1)일 때는 제외
print(page_obj.end_index()) # 마지막 페이지일 때는 제외
return render(request, 'index.html', {'list': page_obj})
index.html로 이동
테이블 밑에 페이징
<body>
<!--추가-->
<!--처음으로-->
<a href="?page=1">처음</a>
<!--이전 페이지-->
<!-- 만약 이전 페이지가 있다면 '이전'에 이전 페이지로 가는 링크-->
{% if list.has_previous %}
<a href="?page={{ list.previous_page_number }}">이전</a>
<!-- 만약에 이전페이지가 존재하지않는다면(첫 페이지) 링크x-->
{% else %}
<a>이전</a>
{% endif %}
<!--페이징-->
<!-- 페이지 객체가 담겨져 있는 list의 페이지 범위만큼 반복-->
{% for page_num in list.paginator.page_range %}
<!-- 만약 페이지 숫자가 list의 숫자와 같다면 page_num에 강조처리-->
{% if page_num == list.number %}
<b>{{ page_num }}</b>
<!-- 아니라면 본인이 가진 숫자의 페이지로 가는 링크를 가진 숫자로 -->
{% else %}
<a href="?page={{ page_num }}">{{ page_num }}</a>
{% endif %}
{% endfor %}
<!-- 다음 페이지 -->
<!-- 만약 다음 페이지가 존재 한다면 '다음'에 다음페이지의 링크 설정-->
{% if list.has_next %}
<a href="?page={{ list.next_page_number }}">다음</a>
<!-- 그게 아니라면 그냥 심심한 '다음' -->
{% else %}
<a>다음</a>
{% endif %}
<!-- 끝으로 -->
<!-- paginator.num_pages는 총 페이지 개수를 가져오는데, 그 수는 마지막 페이지 번호와 같다. 그래서 '끝'이라는 내용에 <a>태그를 사용해 끝으로 가는 링크를 설정-->
<a href="?page={{ list.paginator.num_pages }}">끝</a>
</body>
python shell 실행 : python manage.py shell
파이썬 쉘을 이용한 게시물 100개 생성
(InteractiveConsole)
>>> from myboard.models import MyBoard
>>> from django.utils import timezone
>>> for i in range(1, 101):
... temp = MyBoard(myname=i, mytitle=i, mycontent=i, mydate=timezone.now())
... temp.save()
>>> exit()
다시 서버 실행후 확인
python manage.py createsuperuser
: 모든 권한을 가진 계정 생성
myboard(App) 밑에 admin.py 생성
from django.contrib import admin
from .models import MyBoard
admin.site.register(MyBoard)
서버 가동 후 127.0.0.1:8000/admin/
으로 접속
Myboard로 가면 내가 만들어 놓은 테이블을 출력해준다.
데이터를 수정할 수도 있다.
settings.py를 가서 장고 자체적으로 app으로 지정해놓은 것을 볼 수 있다.
models.py 로 이동
모델 객체 정의
class MyMember(models.Model):
myname = models.CharField(max_length=100)
mypassword = models.CharField(max_length=100)
myemail = models.CharField(max_length=100)
def __str__(self):
return str({'myname': self.myname, 'mypassword': self.mypassword, 'myemail': self.myemail})
python manage.py makemigrations myboard
로 모델 객체 만들어주기
admin.py로 이동
from django.contrib import admin
from .models import MyBoard, MyMember
admin.site.register(MyBoard)
admin.site.register(MyMember)
templates 폴더에 register.html 생성
<body>
<h1>Register</h1>
<form action="/register/" method="post">{% csrf_token %}
NAME : <input type="text" name="myname">
<br>
<!-- 원래는 type을 password로 지정해줘야한다 -->
PASSWORD : <input type="text" name="mypassword">
<br>
EMAIL : <input type="text" name="myemail">
<br>
<input type="submit" value="회원가입">
</form>
</body>
<form>
태그를 만들 때는 항상 옆에 csrftoken을 적어줘야한다.views.py로 이동
# MyMember 모듈 추가
from .models import MyBoard, MyMember
# 비밀번호를 암호화 시키는 모듈
from django.contrib.auth.hashers import make_password
def register(request):
if request.method == "GET":
return render(request, 'register.html')
elif request.method == "POST":
myname = request.POST['myname']
mypassword = request.POST['mypassword']
myemail = request.POST['myemail']
# make_password를 통해 hasher된(암호화) mypassword가 들어감
mymember = MyMember(myname=myname, mypassword=make_password(mypassword), myemail=myemail)
# DB에 저장
mymember.save()
return redirect('/')
return redirect('/')
urls.py로 이동 후 경로 추가
path('register/', views.register),
index.html로 이동 후 내용 추가
<body>
<!-- 회원가입 -->
<a href="register/">회원가입</a>
<br>
<!-- 로그인 -->
{% if not request.session.myname %}
<a href="login/">로그인</a>
{% else %}
<a href="logout/">로그아웃</a>
{% endif %}
</body>
서버에서 확인
http://127.0.0.1:8000/admin/
으로 가서 My members를 확인!templates에 login.html 만들기
<body>
<h1>login</h1>
<form action="" method="post">{% csrf_token%}
NAME : <input type="text" name="myname">
<br>
<!-- 원래는 type을 password로 해야함 -->
PASSWORD : <input type="text" name="mypassword">
<br>
<input type="submit" value="로그인">
</form>
</body>
views.py 로 이동
모듈 호출(check_password)
from django.contrib.auth.hashers import make_password, check_password
def 추가
def login(request):
if request.method == "GET":
return render(request, 'login.html')
else:
myname = request.POST['myname']
mypassword = request.POST['mypassword']
# myname이 myname과 같은 객체 한 개를 가져와 mymember에 저장
mymemeber = MyMember.objects.get(myname=myname)
# 만약 패스워드가 mymember의 패스워드와 같다면(복호화)
if check_password(mypassword, mymemeber.mypassword):
# mymember의 myname이 request.session의 myname속성에 저장
request.session['myname'] = mymemeber.myname
return redirect('/')
else:
return redirect('/login')
urls.py로 이동 후 path 추가
path('login/', views.login),
서버에서 확인
<h1>Hello, {{ request.session.myname | default:"Django" }}</h1>
이 부분이 로그인한 myname으로 바뀌어 출력된 것을 확인할 수 있다.views.py 로 이동
def 추가
def logout(request):
del request.session['myname']
return redirect('/')
urls.py로 이동 후 path 추가
path('logout/', views.logout),
서버에서 확인
구글 크롬의 시크릿 모드를 통해서 확인
그걸 처리하기 위한 서버의 객체가 session
session
에 가지고 있다.
session
은 각 클라이언트마다 따로 존재해 클라이언트가 필요로하는 정보를 서버는 session
에 담아논다.
새 프로젝트(mymember) 생성
django-admin startproject mymember
mymember(App)의 settings.py로 이동
INSTALLED_APPS에 ‘mymember’ 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mymember',
]
TEMPLATES에 ‘DIRS’ 변경
'DIRS': [BASE_DIR/'templates'],
DATABASES에 mysql적용
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql',
'USER': 'root',
'PASSWORD': 'seri1453@@',
'HOST': 'localhost',
'PORT': '3306',
}
}
mymember(Project)에 templates 폴더 생성
templates에 index.html 생성
<body>
<h1>Mymemeber</h1>
<a href="register/">회원가입</a>
<br>
<a href="login/">로그인</a>
</body>
mymember(App)에 forms.py 생성
장고가 기본적으로 제공하는 로그인 폼을 사용해볼 것이다.
모듈 호출
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
UserCreationForm
이 가진 기본적인 필드 : username
, password1
, password2
password1
: 비밀번호
password2
: 비밀번호 확인클래스 생성
class MyMemeberForm(UserCreationForm):
# username, password1,2는 기본 포함, 그 외것들도 추가
email = forms.EmailField()
first_name = forms.CharField()
last_name = forms.CharField()
class Meta:
model = User
fields = ('username', 'password1', 'password2', 'first_name', 'last_name', 'email')
templates 밑에 register.html 생성
<body>
<h1>Register</h1>
<form actioin="." method="post">{% csrf_token %}
<table>
<!-- form 형태를 테이블 형태로 가져온 것-->
{{ form.as_table }}
</table>
<input type="submit" value="회원가입">
</form>
</body>
mymember(App)에 views.py 생성
from django.shortcuts import render, redirect
from .forms import MyMemeberForm
def index(request):
return render(request, 'index.html')
def register(request):
if request.method == "POST":
form = MyMemeberForm(request.POST)
if form.is_valid():
form.save()
return redirect('index')
else:
return render(request, 'register.html', {'form': MyMemeberForm()})
urls.py로 이동
모듈 추가
from . import views
path 추가
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'),
path('register/', views.register, name='register'),
]
cd mymember
: 경로 를 mymember 프로젝트로 잡아주고python manage.py makemigrations mymember
: 모델 객체 생성python manage.py migrate
: DB에 전달
python manage.py runserver
: 서버 가동 후 확인
UserCreationForm
를 사용해 만들어준 화면이다.{{ form.as_table }}
테이블 형태로 폼을 불러왔다.templates에 login.html 생성
<body>
<form action="{% url 'login' %}" method="post">{% csrf_token %}
ID : <input type="text" name="username">
<br>
<!-- 원래 PW input type은 password로 해줘야한다.-->
PW : <input type="text" name="password">
<br>
<input type="submit" value="로그인">
</form>
</body>
templates에 result.html 생성
<body>
<h1>Hello, {{ user.username }}</h1>
<a href="/logout/">로그아웃</a>
</body>
settings.py로 이동
# login / logout
LOGIN_REDIRECT_URL = '/result'
LOGOUT_REDIRECT_URL = '/'
urls.py로 이동
모듈 호출
from django.contrib.auth import views as auth_views
path 추가
path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('result/', views.result, name='result'),
views.py로 이동
def 추가
def result(request):
return render(request, 'result.html')
서버에서 확인
프로젝트 생성
django-admin startproject updown
updown(App) settings.py 열기
TEMPLATES에서 DIRS 설정
'DIRS': [BASE_DIR/'templates'],
내용 추가
# media file upload / download
MEDIA_URL = '/media/' # 경로
MEDIA_ROOT = BASE_DIR/'media' # 폴더
updown(Project) 밑에 templates 폴더와 media 폴더 생성
templates 밑에 index.html 생성
<body>
<h1>File Upload</h1>
<form action="/upload/" method="post" enctype="multipart/form-data">{% csrf_token %}
<input type="file" name="uploadfile">
<br>
<input type="submit" value="업로드">
</form>
</body>
<form>
태그의 enctype
에는 3가지 종류가 있다.
참고 : http://tcpschool.com/html-tag-attrs/form-enctype
application/x-www-form-urlencoded
: 기본값으로, 모든 문자들은 서버로 보내기 전에 인코딩됨을 명시함.multipart/form-data
: 모든 문자를 인코딩하지 않음을 명시함. 이 방식은 <form> 요소가 파일이나 이미지를 서버로 전송할 때 주로 사용함.text/plain
: 공백 문자(space)는 “+” 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시함.views.py 생성
모듈 호출
from django.shortcuts import render
from django.core.files.base import ContentFile
from django.core.files.storage import default_storage
def 생성
def index(request):
return render(request, 'index.html')
def upload_process(request):
# 전달된 파일을 받아서
upload_file = request.FILES['uploadfile']
# print(upload_file)
# print(type(upload_file))
# 받은 파일을 저장
# default_storage가 settings.py에서 잡아준 media root
uploaded = default_storage.save(upload_file.name, ContentFile(upload_file.read()))
# print(uploaded)
# print(type(uploaded))
# 요청에 따라 download.html로 보내주고 저장된 파일도 filename로 감싸서 보낸다.
return render(request, 'download.html', {'filename': uploaded})
urls.py로 이동
모듈 호출
from . import views
path 추가
path('', views.index, name='index'),
path('upload/', views.upload_process),
서버를 열어 파일을 보내보자.
templates에 download.html을 생성
<body>
<h1>File Download</h1>
<input type="button" value="다운로드" onclick="location.href='/download/{{ filename }}'">
</body>
views.py로 이동
모듈 호출
from django.http import HttpResponse
def 추가
def download_process(request, filename):
response = HttpResponse(default_storage.open(filename).read())
response['Content-Disposition'] = f"attachment; filename={filename}"
return response
urls.py로 이동 후 path 추가
path('download/<str:filename>', views.download_process),
서버에서 다운로드 되는 것을 확인
혹시나 파일이름이 한글일 때는 언어 인코딩 설정을 변경해줘야한다.
settings.py 에서 LANGUAGE_CODE 변경
LANGUAGE_CODE : ‘en-us’ -> ‘ko-kr’
LANGUAGE_CODE = 'ko-kr'
그리고 게시판에서 게시물을 작성하고 나면 작성 시간이 실제와 다르게 나와있는데, 한국 기준 시간에 맞춰줘야 한다.
settings.py 에서 TIME_ZONE 변경
TIME_ZONE : UTC -> ‘Asia/Seoul’
TIME_ZONE = 'Asia/Seoul'
파일 및 폴더 생성
파일 시스템 탐색
도움말(man -> manual)
명령어 기초
유닉스(Unix)
특정 코드 지연 실행 - DispatchQueue.main.asyncAfter(deadline: )
Naming Conventions
안드로이드 폰과 맥북에어 M1 USB 테더링 성공
Simulator 풀 스크린 사용 방법
10807번 - 개수 세기
프로그래머스 Lv.1 풀이 코드 모음
프로그래머스 Lv.1 풀이 코드 모음
11047번 - 동전 0
11659번 - 구간 합 구하기 4
14888번 - 연산자 끼워넣기
9184번 - 신나는 함수 실행
24416번 - 알고리즘 수업 - 피보나치 수 1
2580번 - 스도쿠
9663번 - N-Queen
15652번 - N과 M (4)
15651번 - N과 M (3)
15650번 - N과 M (2)
25305번 - 커트라인
25304번 - 영수증
3003번 - 킹, 퀸, 룩, 비숍, 나이트, 폰
15649번 - N과 M (1)
2004번 - 조합 0의 개수
1676번 - 팩토리얼 0의 개수
9375번 - 패션왕 신해빈
1010번 - 다리 놓기
11051번 - 이항 계수 2
11050번 - 이항 계수 1
3036번 - 링
2981번 - 검문
1934번 - 최소공배수
2609번 - 최대공약수와 최소공배수
1037번 - 약수
5086번 - 배수와 약수
1358번 - 하키
1004번 - 어린 왕자
1002번 - 터렛
3053번 - 택시 기하학
2477번 - 참외밭
4153번 - 직각삼각형
3009번 - 네 번째 점
1085번 - 직사각형에서 탈출
11478번 - 서로 다른 부분 문자열의 개수
1269번 - 대칭 차집합
1764번 - 듣보잡
10816번 - 숫자 카드 2
1620번 - 나는야 포켓몬 마스터 이다솜
14425번 - 문자열 집합
10815번 - 숫자 카드
18870번 - 좌표 압축
10814번 - 나이순 정렬
1181번 - 단어 정렬
11651번 - 좌표 정렬하기 2
11650번 - 좌표 정렬하기
1427번 - 소트인사이드
2108번 - 통계학
10989번 - 수 정렬하기 3
2751번 - 수 정렬하기 2
2750번 - 수 정렬하기
22.06.25 ~ 27 부산 먹부림 기록
1436번 - 영화감독 숌
1018번 - 체스판 다시 칠하기
7568번 - 덩치
2231번 - 분해합
2798번 - 블랙잭
11729번 - 하노이 탑 이동 순서
2447번 - 별 찍기 - 10
17478번 - 재귀함수가 뭔가요?
10870번 - 피보나치 수 5
10872번 - 팩토리얼
9020번 - 골드바흐의 추측
4948번 - 베르트랑 공준
1929번 - 소수 구하기
11653번 - 소인수분해
2581번 - 소수
1978번 - 소수 찾기
10757번 - 큰 수 A+B
2839번 - 설탕 배달
2775번 - 부녀회장이 될테야
10250번 - ACM 호텔
2869번 - 달팽이는 올라가고 싶다
1193번 - 분수찾기
2292번 - 벌집
1712번 - 손익분기점
1316번 - 그룹 단어 체커
2941번 - 크로아티아 알파벳
5622번 - 다이얼
2908번 - 상수
1152번 - 단어의 개수
1157번 - 단어 공부
2675번 - 문자열 반복
10809번 - 알파벳 찾기
11720번 - 숫자의 합
11654번 - 아스키 코드
1065번 - 한수
4673번 - 셀프 넘버
15596번 - 정수 N개의 합
4344번 - 평균은 넘겠지
8958번 - OX퀴즈
25083번 - 새싹
Spark Bigdata Pipeline
Spark 3일차
Spark 2일차
1546번 - 평균
Spark 1일차
Hadoop🐘
3052번 - 나머지
2577번 - 숫자의 개수
2562번 - 최댓값
10818번 - 최소, 최대
Linux
MongoDB 조회 문제
MongoDB
1110번 - 더하기 사이클
10951번 - A+B - 4
Oracle 3️⃣
ORACLE 연습용 문제 만들기 숙제
10952번 - A+B - 5
Oracle 2️⃣
2480번 - 주사위 세개
Oracle Day1️⃣
Tensorflow
Big Data
2525번 - 오븐 시계
10871번 - X보다 작은 수
2439번 - 별 찍기 - 2
2438번 - 별 찍기 - 1
11022번 - A+B - 8
11021번 - A+B - 7
2742번 - 기찍 N
2741번 - N 찍기
15552번 - 빠른 A+B
8393번 - 합
10950번 - A+B - 3
9️⃣ 2739번 - 구구단
2884번 - 알람 시계
14681번 - 사분면 고르기
⛏크롤링(Crawling)
2753번 - 윤년
Django 복습 4️⃣
Django 복습 3️⃣
💯 9498번 - 시험 성적
1330번 - 두 수 비교하기
✖ 2588번 - 곱셈
➗ 10430번 - 나머지
Django 복습 2️⃣
Django 복습 1
MySQL 복습!
⁉10926번 - ??!
🆎1008번 - A/B
👩🦲 18108번 - 1998년생인 내가 태국에서는 2541년생?!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🎈✨경 축✨🎈
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
선형 자료구조(1일차에 이어서)
🆎10998번 - A×B
🆎1001번 - A-B
🆎1000번 - A+B
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐶10172번 - 개
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐱10171번 - 고양이
[해당 포스트는 유튜버 나동빈님의 영상을 참고했습니다.]
❤10718번 - We love kriii
🖐2557번 - Hello World
Today I Learned(TIL)📌 (2021.12.31)
Today I Learned(TIL)📌 (2021.12.30)
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[noitce!!] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!