가상 환경 설정하고 프로젝트 준비하기
1. 폴더 생성 후 Visualcode에서 폴더 열기 - 터미널 창 띄우기
2. pip3 install vituralenv - 컴퓨터에 가상 환경 패키지 설치하기
3. vituralenv 'project 이름' - 가상환경에서 project 생성하기
4. source 'project 이름'/bin/activate - 가상 환경 사용 코드
5. pip install django - 장고 프레임워크 설치하기
6. django-admin startproject 'project명' - project 생성하기
7. cd project - project 진입
8. django-admin startapp 'appname' - app 생성
* 프로젝트 안에 여러 앱이 들어간다
* 앱 단위로 코드를 분리해서 관리한다
* 앱 생성시 settings.py 에 등록해야 한다
Models.py - 클래스 정의
ex) class Fcuser(models.Model): username=models.CharField(max_length=32, verbose_name='사용자명')
/ DatetimeField - auto_now_add = True /
class 함수 하단에 / def __str__(self): return self.username /
모델 하단에 class Meta 코드로 DB 설정 가능
class Meta : db_table = '테이블명'
verbose_name = '*'
verbose_name_plural = '*'
python manage.py runserver - local환경에서 서버 실행
python manage.pt createsuperuser - 관리자 생성
admin.py 진입
from. models import Fcuser - 모델 임포트 하기
class FcuserAdmin(admin.ModelAdmin):
list_display('username', 'password') - 튜플 형식으로 보이는 값을 지정할 수 있음
admin.site.register(Fcuser, FcuserAdmin)
-> test 하기 위해서 admin에 등록하고 admin 페이지에서 db test.
template은 <head>에 부트스트랩 css, js CDN 가져오고 <body>에 만들 코드를 작성한다
Views.py - ex) def register(request): return render(request, 'register.html')
url 설정 - ex) path('fcuser/', include('fcuser.urls'))
- fcuser 앱 안에 urls.py 생성 / from. import views / path('register/', views.register)
<form method ="POST" action"."> - form을 통해 서버에 data를 보낸다
{% csrf_token %} 서버에 data를 보낼 때 암호화를 시키고 보냄 - 미작성 시 오류 발생
model 변경 시 - 1. python manage.py makemigrations -> 2. python manage.py migrate
static 등록 - settings.py 하단
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]
-------------------------------------------------------------------------------------------------------------------------------
* login
forms.py -
form django import forms
class LoginForm(forms.Form):
username = forms.CharField(error_message = {'required' = '아이디를 입력해주세요'}, max_length=32, label = '사용자 이름')
password = forms.CharField(error_message = {'required' = '비밀번호를 입력해주세요'} , widget = forms.PasswordInput, label = '비밀번호')
def clean(self):
cleaned_data = super(). clean()
username = cleaned_data_get('username')
password = cleaned_data_get('password')
if username and password :
fcuser = Fcuser.objects.get(username=username)
if not check_password(password. fcuser.password):
self. add_error ('password', '비밀번호를 틀렸습니다')
else:
slef.user_id = fcuser.id
-------------------------------------------------------------------------------------------------------------------------------
views.py -
def login(request):
if request.method == "POST" :
form = LoginForm(request.POST)
if form.is_valid():
request.session ['user'] = form.user_id
return redirect('/')
else :
form = LoginForm()
return render(request, 'login.html', {'form':form})
-------------------------------------------------------------------------------------------------------------------------------
template - {form.as_table} or {form.as_p}를 통해 구현할 수 있지만 반복문을 사용하여 원하는 그림을 구현할 수 있음
<form method = 'POST' action=".">
{% csrf_token %}
{% for filed in form %}
<div class = "form_group">
<label for = "{{ field.id_for_label }}"> {{ field.label }} </label>
<input type = "{{ field.field.widget.input_type }}"
class = "form-control" id = "{{ field.id_for_label }}"
placeholder = "{{ field.label }}" name = "{{ field.name }}" />
{% if field.errors %}
<span style = "color:red"> {{ field.errors }} </span>
{% endif %}
{% endfor %}
-------------------------------------------------------------------------------------------------------------------------------
로그아웃 기능 구현
def logout(request):
if request.session.get('user'):
del(request.session ['user'])
return redirect('/')
-url설정 : path('logout/' , views.logout)
-------------------------------------------------------------------------------------------------------------------------------
class Board(models. Model):
title = models.CharField(max_length=128, verbose_name='제목')
contents = models.TextFiled(verbose_name='내용')
writer = models.Foreignkey('fcuser.Fcuser', on_delete=models.CASCADE, verbose_name='작성자')
def __str__(self):
return self.title
class Meta:
db_table = "board"
verbose_name = "게시글"
verbose_name_plural = "게시글"
-------------------------------------------------------------------------------------------------------------------------------
views.py
def board_list (request):
boards= Board.objects.all() , order_by('-id')
return render (request, 'board_list.html', {'board':board})
-------------------------------------------------------------------------------------------------------------------------------
html
admin에 등록하고 관리자 사이트에서 테스트 글 작성하여 확인한다
반복문을 사용하여 코드 작성
======생략======
{% for board in boards %}
<tr>
<th> {{ board.id }} </th>
<th> {{ board.title }} </th>
<th> {{ board.writer }} </th>
</tr>
{% endfor %}
-------------------------------------------------------------------------------------------------------------------------------
글쓰기 form 구현
class Boardform(forms.Form):
title = forms.CharField(error_message ={'required':'제목을 입력해주세요'}, max_length=128, label ="제목")
contents = forms.CharField(error_message ={'required':'내용을 입력해주세요'}, widget : forms.Textarea, label ="내용")
-------------------------------------------------------------------------------------------------------------------------------
url 연결 - path('write/', views.board_wirte)
/ html 구성해서 화면 만들기 /
-------------------------------------------------------------------------------------------------------------------------------
views.py
def board_wirte(request):
if request.method == 'POST':
form = BoardForm(request.POST)
if form.is_valid():
user.id = request.session.get('user')
fcuser = Fcuser.objects.get(pk=user_id)
board=Board()
board.title= form.cleaned_data ['title']m.cleaned_data['title']
board.contents= form.cleaned_data ['contents']m.cleaned_data['contents']
board.writer = fcuser
board.save()
return redirect('/board/list/')
else:
form = Boardform()
return render(request, 'board_write.html', {'form':form})
이후 상세보기 페이지 만들기
'Project > ToyProject' 카테고리의 다른 글
[Rmanager] Decorator (0) | 2021.07.31 |
---|---|
[Rmanager] generic view (0) | 2021.07.31 |
[Rmanager] Basic tool (0) | 2021.07.31 |
[Rmanager] STEP - 4th (0) | 2021.07.31 |
[Rmanager] STEP - 3th (0) | 2021.07.31 |