Django/응용

[Django 게시판] 2.CBV를 FBV로 (CRUD-Create)

민돌v 2021. 6. 13. 23:52
728x90

Create (fbv)

앞에서 작성한 cbv기반 createview를 fbv로 바꿔보겠다.

1. templates.html

create.html을 다 지우기 아까우니까, 그냥 새로 만들어준다.

1)create2.html

- FBV 형식으로 객체를 생성할때에도, 파일이나 이미지를 올리기 위해서

enctype = "multipart/form-data"를 필수로 적어준다.

- cbv방식에서는 따로 method를 적어주지 않았지만,(default = get 방식),

보안상 가려져야하는 정보는 post방식으로 넘겨주는 것이 좋다.

<form action="{% url 'fbv_create' %}" method="POST" enctype = "multipart/form-data" >
    {% csrf_token %}
    <p>디자이너 생성 페이지</p>

    <!--파일 첨부 -->
    <input type="file" name='image' placeholder="사진 첨부"><br>
    <!-- Email -->
    <input type="name" name ='name' placeholder="name"><br>

    <!-- Password -->
    <input type="adress" name ='adress' placeholder="adress"><br>

    <input type="text" name='discription' placeholder="설명">
    <div>
    <br>
         <button type="submit">Create</button>
    </div>
</form>

2) urls.py

- create_fbv 함수를 따로 만들어 줄것이기에 미리, urls.py에 선언해 준다.

from django import urls
from django.urls import path

from . import views

urlpatterns = [
    # path('',views.home, name ='home'),
    path('',views.DesignerList.as_view(), name='designer'),
    path('create',views.DesignerCreate.as_view(), name='create'),
    path('create_fbv',views.fbvCreate, name='fbv_create'),
    path('delete/<int:pk>',views.DesignerDelete.as_view(), name='delete'),
    path('update/<int:pk>',views.DesignerUpdate.as_view(), name='update'),

]

3. home.html

- home에서 연결되는 url도 바꿔준다.

<a href="{% url 'fbv_create'%}">
<button>
    디자이너 생성
</button>
</a>

 

2. views.py

- people이라는 Designer 객체 변수를 선언해 준다.

- if 'POST' 방식으로 넘어오지 않았다면, 그냥 create.html 화면을 띄우고

- 'POST'방식으로 넘어오는 데이터가 있다면, people 변수에 값을 넣어준다.

- 파일이나, 이미지를 업로드 하기위해서는 "request.FILES[' ']로 데이터를 핸들링 해야한다."

- 그렇지 않으면 이미지 깨지거나, 아예 불러오지를 못한다.

from django.urls import reverse #revese
from django.shortcuts import redirect, render

#fbv Create
def fbvCreate(request):
    people = models.Designer()
    if request.method == 'POST':
        print("객체생성")
        people.name = request.POST['name']
        people.adress = request.POST['adress']
        people.discription = request.POST['discription']
        people.image = request.FILES['image']

        people.save()

        return redirect(reverse('designer'))     #reverse는 url의 name으로 연결시켜준다.

    return render(request,'create.html')
반응형