ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django edit photo by FBV
    Project using python/Cloning Airbnb 2021. 3. 12. 10:31

    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.editPhoto,
            name="edit-photo",
        )]
    

    FBV(Function Based View)

    rooms/views.py

    # rooms/views.py
    
    from django.shortcuts import render, redirect, reverse
    from django.contrib import messages
    from django.contrib.auth.decorators import login_required
    from django.http import Http404
    
    from . import models as room_models
    from photos import models as photo_models
    from users.exception import HostOnly
    
    @login_required
    def editPhoto(request, room_pk, photo_pk):
        if request.method == "GET":
            try:
                if not request.session.get("is_hosting"):
                    raise HostOnly("Page Not Found")
    
                room = room_models.Room.objects.get_or_none(pk=room_pk)
                if room is None:
                    messages.error(request, "Room does not exist")
                    return redirect(reverse("core:home"))
    
                if request.user.pk != room.host.pk:
                    raise Http404("Page Not Found")
                photo = room.photos.get(pk=photo_pk)
    
                return render(
                    request,
                    "pages/rooms/photos/edit_photo.html",
                    context={"room": room, "photo": photo},
                )
            except HostOnly as error:
                messages.error(request, error)
                return redirect(reverse("core:home"))
        elif request.method == "POST":
            try:
                if not request.session.get("is_hosting"):
                    raise HostOnly("Page Not Found")
                caption = request.POST.get("caption")
    
                room = room_models.Room.objects.get_or_none(pk=room_pk)
                photo = room.photos.get(pk=photo_pk)
                photo.caption = caption
                photo.save()
    
                messages.success(request, f"Edit {caption}-photo successfully")
                return redirect(reverse("rooms:photo-list", kwargs={"pk": room.pk}))
            except HostOnly as error:
                messages.error(request, error)
                return redirect(reverse("core:home"))
    

    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>
              <input type="text" id="caption" name="caption" placeholder="Caption" value="{{photo}}" required>
            </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/b5c45e7392fe48c76a30673c1eb0b53b913f89df

    'Project using python > Cloning Airbnb' 카테고리의 다른 글

    django delete-photo by FBV  (0) 2021.03.12
    django edit-photo by CBV  (0) 2021.03.12
    django create-photo by CBV  (0) 2021.03.12
    django create-photo by FBV  (0) 2021.03.12
    django photo list by CBV  (0) 2021.03.11

    댓글

Designed by Tistory.