Project using python/Cloning Airbnb

django edit-photo by CBV

Cog Factory 2021. 3. 12. 11:34

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:room_pk>/photos/<int:photo_pk>/edit/",
        views.EditPhotoView.as_view(),
        name="edit-photo",
    )]

CBV(Class Based View)

rooms/views.py

  CBV는 django에서 정의한 여러가지 View들을 이용한다. 그 중 UpdateView를 이용해서 edit-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 photos import models as photo_models
from rooms import forms

class EditPhotoView(
    mixins.LoggedInOnlyView, mixins.HostOnlyView, SuccessMessageMixin, UpdateView
):

    """ Edit Photo View Definition """

    model = photo_models.Photo
    template_name = "pages/rooms/photos/edit_photo.html"
    fields = ("caption",)
    pk_url_kwarg = "photo_pk"
    success_message = "Photo Updated"

    def get_form(self, form_class=None):
        form = super().get_form(form_class=form_class)
        form.fields["caption"].widget.attrs = {"placeholder": "Caption"}
        return form

    def get_object(self, queryset=None):
        photo = super().get_object(queryset=queryset)
        if self.request.user.pk != photo.room.host.pk:
            raise Http404("Page not found")
        return photo

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        photo = context["photo"]
        context["room"] = photo.room
        return context

    def get_success_url(self):
        room_pk = self.kwargs.get("room_pk")
        return reverse("rooms:photo-list", kwargs={"pk": room_pk})

 

templates

pages/rooms/photos/edit_photo.html

{% extends 'base.html' %}

{% block page_title %}
  Edit {{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">Edit Photo('{{photo}}')</h1>
      <form method="post" class="form" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="form_input rounded-lg flex">
          <label for="caption">Caption:</label>
          {{form.caption}}
        </div>
        <button class="form_button">Edit</button>
      </form>
      <button class="button bg-gray-700">
        <a href="{% url 'rooms:photo-list' room.pk %}">Back</a>
      </button>
    </div>
  </div>
{% endblock content %}

참고 자료

  • 노마드 코더의 Airbnb 클론 강의

소스 코드

github.com/zpskek/airbnb-clone-v3/commit/8c6316a04b0a9f448336c8726e65a31220a49340