TIL/2023.7월

TIL 최종프로젝트(19) 피드백 수정

황소탄 2023. 7. 5. 01:02

2023.07.04 화 <- 07.03 월요일 자 TIL

 

css나 html 부분을 빼면 크게 적을게 없네요 간단히 적어봅시다

 

[피드백]

1.행사 정보를 보여주는 카드에서 티켓 가격을 보여주었으면 좋겠습니다.

2.댓글 작성 시 글을 어디에 써야할지 알아보기 힘들다.

3.댓글 작성 시 문제에 대한 안내가 미흡하다, 예시로 이미지를 빼먹고 댓글 등록을 시도할 시 아무런 안내창도 없고 등록도 되지 않는다

4.(팀내 의견)행사 리스트 페이지에 티켓 가격은 제외해라 보기 안 좋다

 

[적용]

1.행사 정보를 보여주는 카드에서 티켓 가격을 보여주었으면 좋겠습니다.

 

행사 정보를 받아오는 모델은 Event 모델입니다.(백엔드)

class Event(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    content = models.TextField()
    image = models.ImageField(blank=True, upload_to="%Y/%m/")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    event_start_date = models.DateTimeField()
    event_end_date = models.DateTimeField()
    time_slots = models.JSONField()
    max_booking = models.PositiveIntegerField(validators=[MinValueValidator(1)])
    money = models.IntegerField()
    likes = models.ManyToManyField(User, related_name="like_event", blank=True)
    event_bookmarks = models.ManyToManyField(
        User, related_name="bookmark_events", blank=True
    )

다행히 가격을 보여주기 위한 데이터가 담긴 필드가 있습니다.

 

행사를 보여줄 때에는 fetch를 사용하여 GET 메소드를 통해 데이터를 가져와야 합니다.

//행사 리스트 페이지 중 랜덤 영역
async function RandomEventList() {
  const random_response = await fetch(`${backend_base_url}/events/`, { method: 'GET' });
  const random_response_json = await random_response.json();
  
//행사 리스트 페이지
async function EventList() {
  const response = await fetch(`${backend_base_url}/events/`);
  const response_json = await response.json()
  const eventListContainer = document.getElementById('event_list');

  response_json.forEach
  
  //행사 상세 페이지
  async function EventDetail() {
  const urlParams = new URLSearchParams(window.location.search);
  event_id = urlParams.get('event_id');
  const eventDetailURL = `${frontend_base_url}/event-detail.html?event_id=${event_id}`;

  const response = await fetch(`${backend_base_url}/events/${event_id}`, { method: 'GET' });

행사 리스트의 경우는 하나 이상의 데이터 묶음을 가져오니 forEach를 사용하여 하나 하나 꺼내 사용합니다.

RandomEventList, EventList 함수의 url이 같고 EventDetail 함수의 url은 다릅니다.

 

백엔드 urls.py에 작성한 url을 봅시다

    path("", views.EventView.as_view(), name="event_view"),
    path("<int:event_id>/", views.EventDetailView.as_view(), name="event_detail_view"),

RandomEventList, EventList는 같은 view를 사용하고 EventDetail는 다른 view를 사용합니다.

 

해당 view가 사용하는 serializer를 봅시다.

class EventSerializer(serializers.ModelSerializer):
    created_at = serializers.DateTimeField(format="%m월%d일 %H:%M", read_only=True)
    updated_at = serializers.DateTimeField(format="%m월%d일 %H:%M", read_only=True)
    event_start_date = serializers.DateTimeField(format="%Y-%m-%d", read_only=True)
    event_end_date = serializers.DateTimeField(format="%Y-%m-%d", read_only=True)
    review_count = serializers.SerializerMethodField()

    likes_count = serializers.SerializerMethodField()
    author = serializers.SerializerMethodField()

    def get_author(self, obj):
        author = obj.author.email.split("@")[0]
        return author

    def get_review_count(self, obj):
        return obj.review_set.count()

    def get_likes_count(self, obj):
        return obj.likes.count()

    class Meta:
        model = Event
        fields = (
            "id",
            "author",
            "title",
            "content",
            "image",
            "created_at",
            "updated_at",
            "event_start_date",
            "event_end_date",
            "time_slots",
            "max_booking",
            "money",
            "likes",
            "review_count",
            "likes_count",
            "event_bookmarks",
        )


class EventListSerializer(EventSerializer):
    class Meta:
        model = Event
        fields = (
            "id",
            "title",
            "image",
            "event_start_date",
            "event_end_date",
            "review_count",
            "likes",
            "likes_count",
            "event_bookmarks",
        )

EventListSerializer은 EventSerializer를 상속하여 사용합니다.

 

EventListSerializer는 리스트 형태로 출력되기 때문에 EventSerializer보다는 간략한 정보를 담고 있습니다.

 

리스트와 상세페이지에서 가격이 나와야하기 때문에 EventListSerializer 필드에 "money", 를 추가해주어야 합니다.

 

이후 프론트에서 받아온 money를 변수에 넣어 append 시켜줍니다

(코드생략)
  const get_money = response_json.money

(코드생략)
  eventMoneyElement.id = 'event_money'
  eventMoneyElement.className = 'event-money';
  eventMoneyElement.textContent = "관람료: 1인 "+get_money+"원"
(코드생략)
  cardTxtElement.appendChild(eventMoneyElement);

css에 해당 className이 없다면 style을 주기위해 css를 추가해 주어야 합니다.

관람료가 출력됩니다!

 

2.댓글 작성 시 글을 어디에 써야할지 알아보기 힘들다.

플레이스홀더 속성을 이용하면 간단하게 구현이 가능합니다.

<input id="com_txt" type="text" class="txt" placeholder="내용을 입력해주세요">

커트롤+쉬프트+c 를 누르고 해당 영역을 클릭하면 이 영역이 어디에 있는지 개발자 도구를 통해 확인이 가능합니다.

지금 placeholder가 추가되어 있는 것을 확인할 수 있습니다.

저런식으로 html에 해당 태그에 속성을 추가해도 되고, js 부분에서 추가하여도 됩니다.

reviewContentElement.placeholder = '플레이스홀더 내용';

단, 플레이스홀더는 input, textarea 태그에서만 사용이 가능합니다.

3.댓글 작성 시 문제에 대한 안내가 미흡하다.

이 부분은 정리한 것이 있어 이미지로 대체하겠습니다.

 

 

오류 해결 전/ 해결 후를 사진이나 동영상으로 남겨야해서 정리하여 저장해둔 사진입니다.

TIL 쓰기 쉽다!

 

느낀점

4번의 경우 기껏 만든 기능을 행사 상세페이지를 제외하고 모두 제거하게 되었습니다.

이렇게 팀과의 끝없는 의논이 중요합니다.