ACHO.pk devlog

[멋쟁이사저처럼10기] Django 블로그 만들기(글 생성-사용자입력) 본문

멋쟁이사자처럼

[멋쟁이사저처럼10기] Django 블로그 만들기(글 생성-사용자입력)

Acho 2022. 7. 4. 20:09

<초기 설정>

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

admin&nbsp; 사이트

Blog 객체에 s가 붙어 생성된 것을 확인할 수 있다.

또한, 글도 쓸 수 있다.

글을 쓸 수 있다.

글을 쓰고 나서 글 제목이 'Blog object'로 나와있는데 이것도 바꿀 수 있다.

 

models.py 파일에서 해당 class 안에 함수를 하나 추가하면 된다.

def __str__(self):
        return self.title

제목 설정하기


django에서 사용자 입력을 받는 방법

admin 사이트가 아닌 블로그 글을 html 상에서 생성할 수 있도록 하는 방법

  1. HTML Form 이용하기
  2. Django Form 이용하기
  3. 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})

 

 

 

 

 

 

 

 

 

 

 

Comments