일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 멋사
- 멋사10기
- 멋쟁이사자처럼대학
- 멋사 합격
- IT동아리
- 기사 제목 크롤링
- 멋쟁이사자처럼10기
- 파이썬
- 멋사 면접
- 멋쟁이사자처럼
- 멋쟁이사자처럼11기
- 코딩동아리
- 백엔드
- 알림봇
- 파이썬 크롤링
- 크롤링
- 멋사 10기
- 멋사 서류
- 멋사 서류평가
- django
- 멋쟁이사자처럼 서류
- discord
- ㅏㄴ
- 웹동아리
- 멋쟁이 사자처럼
- 디스코드봇
- 멋사11기
- 멋사12
- 깃허브
- API
- Today
- Total
ACHO.pk devlog
[멋쟁이사저처럼10기] Django 블로그 만들기(글 생성-사용자입력) 본문
<초기 설정>
1. myproject 생성
2. blogapp 생성 + 등록
3. templates 폴더 생성 + index.html 생성 + url 등록(함수 실행시키기 위함) + def함수 등록(html과 연결시키기 위함)
models.py에 코드를 생성하기 전에 초기 설정들을 database에 반영하기 위해 migration 해준다.
python manage.py migrate
models.py에 Blog라는 객체를 만들 때 class로 정의하고, models안에 Model 기능을 사용한다.
database에 migration 될 객체임을 인지하게 된다.
from django.db import models
class Blog(models.Model):
#title에 해당하는 데이터가 200자를 넘지 않게 함
title = models.CharField(max_length=200)
body = models.TextField()
#작성 시간
date = models.DateTimeField(auto_now_add=True)
변경사항이 담긴 파일을 만들어준다.
python manage.py makemigrations
실제 database에 반영해준다.
python manage.py migrate
Blog 객체가 잘 만들어졌는지는 어플리케이션 폴더 안에 admin.py 파일에서 확인할 수 있다.
#같은 폴더에 있는 models.py에서 Blog 임포트
from .models import Blog
admin.site.register(Blog)
admin 사이트에서 확인하기 위해서 관리자 계정을 만들어준다.
python manage.py createsuperuser
Blog 객체에 s가 붙어 생성된 것을 확인할 수 있다.
또한, 글도 쓸 수 있다.
글을 쓰고 나서 글 제목이 'Blog object'로 나와있는데 이것도 바꿀 수 있다.
models.py 파일에서 해당 class 안에 함수를 하나 추가하면 된다.
def __str__(self):
return self.title
django에서 사용자 입력을 받는 방법
admin 사이트가 아닌 블로그 글을 html 상에서 생성할 수 있도록 하는 방법
- HTML Form 이용하기
- Django Form 이용하기
- Django modelForm 이용하기
우리는 글 생성하기 버튼을 눌렀을 때 블로그 글이 생성되도록 DB에 반영이 되게 만들어야 한다.
HTML Form 이용하기
1. new.html 생성
<form action="{% url 'create' %}" method="POST">
{% csrf_token %}
<div>
<label for="title">제목</label><br>
<input type="text" name="title" id="title">
</div>
<div>
<label for="body">본문</label><br>
<textarea type="body" id="body" cols="30" rows="10"></textarea>
</div>
<input type="submit" value="글 생성">
</form>
2. views.py에서 new, create 함수 생성
from django.shortcuts import render, redirect
from .models import Blog
from django.utils import timezone
#블로그 글 작성 html을 보여주는 함수
def new(request):
return render(request, 'new.html')
#블로그 글을 저장해주는 함수
def create(request):
if(request.method == 'POST'):
post = Blog()
post.title = request.POST['title']
post.body = request.POST['body']
post.date = timezone.now()
post.save()
return redirect('home') #home 함수로 다시 돌아감
MultiValueDictKeyError 에러가 떴다...
에러난 부분을 보니 views.py 파일에서 'body' 부분에서 난 에러였다.
해당 부분은 아래 코드처럼 바꾸면 잘 실행된다.
post.body = request.POST.get('body','')
난 아래 블로그를 참고했다.!!!! 좋으신 분...
https://blog.naver.com/tinalsj/221585069306
[Django] MultiValueDictKeyError(key) 오류 & 해결 방법
장고를 이용해서 글을 업로드하고 읽어들이는 코드를 짜던 중에 오류 를 만나게 되었다. (오류,, 오류,,, ...
blog.naver.com
3. urls.py에서 url 경로 설정
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
#html 폼을 이용
path('new/', views.new, name="new"),
path('create/', views.create, name="create"),
]
Django Form 이용하기
Django는 하나의 url에서 GET 요청과 POST 요청을 모두 처리할 수 있다.
index.html
<a href="{% url 'djangoform' %}">django form을 이용한 새 글 작성</a>
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
#django form을 이용해서 블로그 객체 만들기
path('djangoform/', views.djangoform, name='djangoform'),
]
blogapp(어플리케이션) 하위에 forms.py 생성
from django import forms
class BlogForm(forms.Form):
#내가 입력받고자 하는 값들
title = forms.CharField()
body = forms.CharField(widget=forms.Textarea)
views.py
from .forms import BlogForm
#django form을 이용해서 입력값을 받는 함수
#GET 요청 처리 (= 입력값을 받을 수 있는 html을 갖다 줘야함)
#POST 요청 처리 (= 입력한 내용을 데이터 베이스에 저장, form에서 입력한 내용을 처리)
#둘 다 처리가 가능한 함수
def djangoform(request):
if request.method == 'POST':
#입력 내용을 DB에 저장
form = BlogDjangoForm(request.POST, request.FILES)
#데이터 형식에 맞지 않는 유효하지 않은 값
if form.is_valid():
post = Blog()
post.title = form.cleaned_data['title']
post.body = form.cleaned_data['body']
post.save()
return redirect('home')
else:
#입력을 받을 수 있는 html을 갖다 주기
form = BlogDjangoForm()
return render(request, 'form_create.html', {'form':form})
- render()의 3번째 인자로 views.py 내의 데이터를 html에 넘겨줄 수 있다.(단, 딕셔너리 자료형으로 넘겨줘야 한다.)
- views.py에서 render()의 3번째 인자로 넘겨준 데이터는 html 내에서 {{}}에 감싸진 채로 표현될 수 있다.
- 입력값의 유효성 검사를 위해 .is_valid() 메서드를 사용한다.
form_create.html 파일 생성
<h1>Django form을 이용한 </h1>
<form action="" method="POST">
{% csrf_token %}
<table>
<!--table 태그가 감싸진 것처럼 form이 보임-->
{{ form.as_table }}
<!--p 태그가 감싸진 것처럼 form이 보임-->
{{ form.as_p }}
<!--ul 태그가 감싸진 것처럼 form이 보임-->
{{ form.as_ul }}
</table>
<input type='submit' value="새 글 생성하기">
</form>
Django modelForm 이용하기
index.html
<a href="{% url 'modelform' %}">django ModelForm을 이용한 새 글 작성</a>
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
#django modelform을 이용해서 블로그 객체 만들기
path('modelform/', views.modelform, name='modelform'),
]
forms.py
from .models import Blog
class BlogModelForm(forms.ModelForm):
class Meta:
model = Blog
# fields = '__all__'
fields = ['title', 'body']
models.py 파일 안에 있는 class Blog 안에 있는 모든 칼럼을 입력받는다면
- fields = __all__
특정 field만 입력받고 싶다면
- field = [' ', ' ']
views.py
def modelform(request):
if request.method == 'POST':
#입력 내용을 DB에 저장
form = BlogModelForm(request.POST)
#데이터 형식에 맞지 않는 유효하지 않은 값
if form.is_valid():
form.save()
return redirect('home')
else:
#입력을 받을 수 있는 html을 갖다 주기
form = BlogModelForm()
return render(request, 'new.html', {'form':form})
'멋쟁이사자처럼' 카테고리의 다른 글
[멋쟁이사저처럼10기] Django 블로그 만들기(파일 업로드) (0) | 2022.07.06 |
---|---|
[멋쟁이사저처럼10기] Django 블로그 만들기(글 목록 띄우기, url 계층) (0) | 2022.07.06 |
[멋쟁이사저처럼10기] Django models.py (0) | 2022.07.04 |
[멋쟁이사저처럼10기] Django 회사 소개 사이트 만들기 (0) | 2022.06.26 |
[멋쟁이사저처럼10기] Django template 언어와 속성, 네임스페이스(url 이동) (0) | 2022.06.26 |