-
django create-photo by CBVProject using python/Cloning Airbnb 2021. 3. 12. 10:08
url 설정
config/urls.py
urlpatterns = [ path("rooms/", include("rooms.urls", namespace="room")) ]
rooms/urls.py
from django.urls import path from . import views app_name = "rooms" urlpatterns = [ path("<int:pk>/photos/create/", views.CreatePhotoView.as_view(), name="create-photo") ]
CBV(Class Based View)
rooms/views.py
CBV는 django에서 정의한 여러가지 View들을 이용한다. 그 중 CreateView를 이용해서 create-photo page를 작성한다.
# rooms/views.py from django.views.generic import CreateView from django.http import Http404 from django.shortcuts import redirect, reverse from users import mixins from rooms import models as room_models from rooms import forms class CreatePhotoView( mixins.LoggedInOnlyView, mixins.HostOnlyView, SuccessMessageMixin, FormView ): """ Create Photo View Definition """ form_class = forms.CreatePhotoForm template_name = "pages/rooms/photos/create_photo.html" pk_url_kwarg = "pk" def get_context_data(self, **kwargs): pk = self.kwargs.get(self.pk_url_kwarg) room = room_models.Room.objects.get(pk=pk) if self.request.user != room.host: raise Http404("Page not found") context = super().get_context_data(**kwargs) context["room"] = room return context def form_valid(self, form): pk = self.kwargs.get(self.pk_url_kwarg) room = room_models.Room.objects.get(pk=pk) photo = form.save() photo.room = room photo.save() return redirect(reverse("rooms:photo-list", kwargs={"pk": pk}))
forms.py
rooms/forms.py
from django import forms from photos import models as photo_models class CreatePhotoForm(forms.ModelForm): """ Create Photo Form Definition """ class Meta: model = photo_models.Photo fields = ( "caption", "file", ) widgets = { "caption": forms.TextInput(attrs={"placeholder": "Caption"}), "file": forms.FileInput(attrs={"class": "p-1 w-full"}), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["file"].required = True def save(self, *args, **kwargs): photo = super().save(commit=False) return photo
templates
pages/rooms/photos/create_photo.html
{% extends 'base.html' %} {% block page_title %} Create {{room.name}}'s Photo {% endblock page_title %} {% block search-bar %} <div></div> {% endblock search-bar %} {% block content %} <div class="background"> <div class="wrap"> <h1 class="text-3xl font-bold pb-6 pt-3 text-center">Create Photo</h1> <form method="post" class="form" enctype="multipart/form-data"> {% csrf_token %} <div class="form_input rounded-tr-lg rounded-tl-lg"> {{form.caption}} </div> <div class="border p-3 border-gray-400 flex justify-between rounded-bl-lg rounded-br-lg"> {{form.file}} </div> <button class="form_button">Create</button> </form> <button class="button bg-gray-700"> <a href="{% url 'rooms:room-detail' room.pk %}">Back</a> </button> </div> </div> {% endblock content %}
참고 자료
- 노마드 코더의 Airbnb 클론 강의
소스 코드
github.com/zpskek/airbnb-clone-v3/commit/ab463362e3639e092c61f504d9aeee0505a6ec4e
'Project using python > Cloning Airbnb' 카테고리의 다른 글
django edit-photo by CBV (0) 2021.03.12 django edit photo by FBV (0) 2021.03.12 django create-photo by FBV (0) 2021.03.12 django photo list by CBV (0) 2021.03.11 django photo list by FBV (0) 2021.03.11