ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django create-photo by CBV
    Project 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

    댓글

Designed by Tistory.