SW 프로젝트 11주차 활동 일지

고태경·2023년 11월 4일
0

SW 프로젝트

목록 보기
5/9
post-thumbnail

1주차 OT 8/30
2주차 주제 선정 (타임캡슐) 9/6
3주차 주제 변경 (냉장고 관리 웹사이트) 9/13
4주차 주제 결정 및 plan A, B 설정 9/20
5주차 프로젝트 첫 번째 중간 보고 9/27 (9/21~9/26)
6주차 프로젝트 두 번째 중간 보고 9/27 (9/27~10/3)
7주차 프로젝트 계획 보고서 발표
8주차 시험 주 (자습)
9주차 프로젝트 세 번째 중간 보고
10주차 프로젝트 네 번째 중간 보고(~10/31)

11주차 프로젝트 다섯 번째 중간 보고(~11/07)

이번 주차 한 것

① 외래키 User 테이블 추가

📂calendar/models.py

from django.db import models
from django.contrib.auth.models import User # user 연결

class Events(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255,null=True,blank=True)
    start = models.DateTimeField(null=True,blank=True)
    end = models.DateTimeField(null=True,blank=True)



    class Meta:
        db_table = "tblevents"
 # 마이그레이션 및 마이그레이트
(venv) PS C:\django_calender\django_calender> python manage.py makemigrations
Migrations for 'calender':
  calender\migrations\0005_events_user.py
    - Add field user to events
(venv) PS C:\django_calender\django_calender> python manage.py migrate       
System check identified some issues:

WARNINGS:
allauth.EmailAddress: (models.W036) MySQL does not support unique constraints with conditions.
        HINT: A constraint won't be created. Silence this warning if you don't care about it.
Operations to perform:
  Apply all migrations: admin, auth, calender, contenttypes, sessions, sites, socialaccount
Running migrations:
  Applying calender.0005_events_user... OK

이게 무슨 말인가 하니

경고:
allauth.EmailAddress: (models.W036) MySQL은 조건부로 제약 조건을 가진 고유 제약(unique constraints)을 지원하지 않습니다. 이에 대해 걱정하지 않는다면, 이 경고를 무시하세요.
수행할 작업:

다음 애플리케이션에 대해 모든 마이그레이션 적용: admin, auth, calender, contenttypes, sessions, sites, socialaccount

이 경고는 django-allauth 라이브러리의 EmailAddress 모델이 MySQL에서 조건부 고유 제약을 지원하지 않는다는 것을 알려주고 있습니다. 애플리케이션에서 이 문제가 중요하지 않다면, 경고를 무시하고 진행하면 됩니다. 그리고 데이터베이스 마이그레이션을 적용하기 위해 python manage.py migrate 명령어를 실행하라는 지시가 있습니다. 라네요.

-> user_id가 추가된 것을 확인할 수 있음!!

② 로그인 정보에 맞는 이벤트만 보이게 변경 + 전체적인 views.py 수정

📂 calendar/views.py 10주차 코드

from django.shortcuts import render

# Create your views here.
from django.http import JsonResponse
from calender.models import Events

def index(request):
    all_events = Events.objects.all()
    context = {
        "events":all_events,
    }
    return render(request, 'landing.html', context)

'''
def all_events(request):
    all_events = Events.objects.all() # 모든 이벤트 받아옴
    out = []
    for event in all_events:
        out.append({
            'title': event.name,
            'id': event.id,
            'start': event.start.strftime("%m/%d/%Y %H:%M:%S"),
            'end': event.end.strftime("%m/%d/%Y" "%H:%M:%S"),
        })
    return JsonResponse(out, safe=False) # 클라이언트한테 전달
'''
def all_events(request):
    all_events = Events.objects.all()
    out = []
    for event in all_events:
        if event.start and event.end:  # start와 end가 None이 아닌 경우에만 strftime을 호출
            out.append({
                'title': event.name,
                'id': event.id,
                'start': event.start.strftime("%m/%d/%Y %H:%M:%S"),
                'end': event.end.strftime("%m/%d/%Y %H:%M:%S"),
            })
    return JsonResponse(out, safe=False)

def add_event(request):
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    title = request.GET.get("title", None)
    event = Events(name=str(title), start=start, end=end)
    event.save()
    data = {}
    return JsonResponse(data)


def update(request):
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    title = request.GET.get("title", None)
    id = request.GET.get("id", None)
    event = Events.objects.get(id=id)
    event.start = start
    event.end = end
    event.name = title
    event.save()
    data = {}
    return JsonResponse(data)


def remove(request):
    id = request.GET.get("id", None)
    event = Events.objects.get(id=id)
    event.delete()
    data = {}
    return JsonResponse(data)

필터링이 제대로 이어지지 않았던 이전 코드 ↓

📂calendar/views.py

def all_events(request):
    all_events = Events.objects.all()
    out = []
    for event in all_events:
        out.append({
            'title': event.name,
            'id': event.id,
            'start': event.start.strftime("%m/%d/%Y, %H:%M:%S"),
            'end': event.end.strftime("%m/%d/%Y, %H:%M:%S"),
            'user_id': request.user.id  # 로그인한 사용자의 ID를 넣어줍니다.
        })

필터링이 제대로 이루어지게 됨 (뿌잉뿌잉^^) ↓

📂calendar/views.py

@login_required(login_url='accounts/login/')
def all_events(request):
    # 현재 로그인한 사용자와 연결된 이벤트들만 가져옵니다.
    user_events = Events.objects.filter(user=request.user)
    out = []
    for event in user_events:
        out.append({
            'title': event.name,
            'id': event.id,
            'start': event.start.strftime("%Y-%m-%d %H:%M:%S"),
            'end': event.end.strftime("%Y-%m-%d %H:%M:%S"),
            'user_id': event.user.id  # 로그인한 사용자의 ID를 넣어줍니다.
        })

    return JsonResponse(out, safe=False)

index 함수 수정 1차 - 10주차 code ↓

  • 그냥 그저 그냥 일반 걍 코드, 원래 코드 그냥 코드
📂 calendar/views.py

def index(request):
    # 사용자가 로그인했는지 확인합니다.
    if request.user.is_authenticated:
        # 로그인한 사용자의 이벤트만 필터링합니다.
        user_events = Events.objects.filter(user=request.user)
    else:
        # 비로그인 사용자에게는 이벤트를 보여주지 않습니다.
        user_events = Events.objects.none()

    context = {
        "events": user_events,
    }
    return render(request, 'calendar.html', context)

index 함수 수정 2차 ↓

-> 로그인을 하지 않으면 대문페이지를 볼 수 없음

📂 calendar/views.py

@login_required(login_url='accounts/login/')  # 로그인하지 않은 사용자를 로그인 페이지로 리다이렉트합니다.
def index(request):
    # 현재 로그인한 사용자와 연결된 이벤트들만 가져옵니다.
    user_events = Events.objects.filter(user=request.user)

    context = {
        "events": user_events,
    }
    return render(request, 'calendar.html', context)

index 함수 수정 3차 - 완성 ↓

📂 calendar/views.py

def index(request):
    # 로그인한 사용자의 이벤트만 가져옵니다. 로그인하지 않았다면 모든 이벤트를 가져옵니다.
    user_events = Events.objects.filter(user=request.user) if request.user.is_authenticated else Events.objects.all()

    # 로그인 여부에 따라 템플릿에 변수 전달
    context = {
        "events": user_events,
        "is_user_authenticated": request.user.is_authenticated,
    }
    return render(request, 'calendar.html', context)

+ index / all_events 함수의 차이점?

index 함수:
이 함수는 캘린더 페이지의 HTML을 렌더링하기 위해 사용됩니다.
이 함수는 Django의 render 함수를 사용하여 calendar.html 템플릿과 함께 사용자의 이벤트 데이터를 브라우저에 전달합니다.
템플릿이 렌더링될 때 user_events 변수를 통해 사용자 관련 이벤트 정보를 페이지에 제공합니다.
주로 사용자가 웹 사이트의 캘린더 페이지를 처음 방문할 때 호출됩니다.

all_events 함수:

이 함수는 클라이언트 측 JavaScript로부터의 AJAX 요청에 응답하여 JSON 형식의 이벤트 데이터를 제공합니다.
이 함수는 FullCalendar와 같은 클라이언트 측 캘린더 라이브러리에서 필요로 하는 형식으로 이벤트 정보를 반환합니다.
사용자가 캘린더에 대한 상호작용을 할 때(예를 들어, 페이지를 새로 고침하거나 이벤트를 추가/수정/삭제) 비동기적으로 호출되어 최신 이벤트 정보를 제공합니다.

둘 다 필요한 이유:

index 함수는 페이지를 처음 렌더링할 때 필요하며, 페이지의 HTML 구조와 초기 상태를 설정합니다.
all_events 함수는 페이지가 이미 렌더링된 이후에 사용자가 캘린더와 상호작용하는 동안 필요한 데이터를 제공합니다. 즉, 페이지의 동적인 부분(이벤트 추가, 수정, 삭제 등)을 처리합니다.
이 두 함수는 웹 애플리케이션에서 서로 다른 시점과 목적으로 사용되므로 둘 다 필요합니다. index는 페이지 로딩 시 사용자에게 초기 상태를 보여주고, all_events는 이후 사용자의 요청에 따라 실시간으로 데이터를 갱신하고 반환하는 데 사용됩니다. 이렇게 분리함으로써, 서버는 필요한 시점에만 데이터를 처리하고 전송하여 효율적으로 리소스를 관리할 수 있습니다.

③ 카테고리 필드 추가

📂 calender/models.py

from django.db import models
from django.contrib.auth.models import User # user 연결

class Events(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255,null=True,blank=True)
    start = models.DateTimeField(null=True,blank=True)
    end = models.DateTimeField(null=True,blank=True)

	### 추가한 코드
    f_categories = models.CharField(max_length=50, null=True, blank=True)

    class Meta:
        db_table = "tblevents"

④ 입력창 수정

10주차

📂 script.html

<!-- script -->
<!-- FullCalendar 초기화 -->
<script>
   $(document).ready(function () {
       var calendar = $('#calendar').fullCalendar({
           header: {
               left: 'prev,next today',
               center: 'title',
               right: 'month,listMonth'
           },
           events: '/all_events',
           selectable: true,
           selectHelper: true,
           editable: true,
           eventLimit: true,
           
           ### 여기 주목
           select: function (start, end, allDay) {
               var title = prompt("Enter Event Title");
               if (title) {
                   var start = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
                   var end = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");
                   $.ajax({
                       type: "GET",
                       url: '/add_event',
                       data: {'title': title, 'start': start, 'end': end},
                       dataType: "json",
                       success: function (data) {
                           calendar.fullCalendar('refetchEvents');
                           alert("Added Successfully");
                       },
                       error: function (data) {
                           alert('로그인을 한 뒤 이용하세요!');
                       }
                   });
               }
           },
           (생략...)
</script>

scripts 수정

📂 script.html 수정 코드

<script>
   $(document).ready(function () {
       var calendar = $('#calendar').fullCalendar({
           header: {
               left: 'prev,next today',
               center: 'title',
               right: 'month,listMonth'
           },
           events: '/all_events',
           selectable: true,
           selectHelper: true,
           editable: true,
           eventLimit: true,
           
### 여기 주목
// 날짜를 선택할 때
select: function (start, end, allDay) {
    var foodName = "";
    var startDate = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
    var endDate = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");

    // 모달 대화 상자 열기
    $("#event-food").val("");
    $("#event-start").val(startDate);
    $("#event-end").val(endDate);

    $("#event-dialog").dialog({
        title: '이벤트 정보 입력',
        buttons: {
            '저장': function () {
                foodName = $("#event-food").val();
                startDate = $("#event-start").val();
                endDate = $("#event-end").val();
                var category = $("#category").val(); // 선택한 카테고리 값 가져오기

                // 서버로 이벤트 데이터 전송
                $.ajax({
                    type: "GET",
                    url: '/add_event',
                    data: {'title': foodName, 'start': startDate, 'end': endDate, 'category': category}, // 카테고리 정보 추가
                    dataType: "json",
                    success: function (data) {
                        calendar.fullCalendar('refetchEvents');
                        alert("Added Successfully");
                        $("#event-dialog").dialog('close');
                    },
                    error: function (data) {
                        alert('There is a problem!!!');
                    }
                });
            },
            '취소': function () {
                $("#event-dialog").dialog('close');
            }
        },
        close: function () {
            // 다이얼로그가 닫힐 때 입력 값 초기화
            $("#event-food").val("");
            $("#event-start").val("");
            $("#event-end").val("");
        },
        modal: true
    });
},
(생략...)
</script>

event_modal.html 추가

📂 event_modal.html 추가

   <!-- 추가된 부분: 모달 창 -->
    <div id="event-dialog" title="이벤트 정보 입력">
        <label for="event-food">음식 이름:</label>
        <input type="text" id="event-food" name="event-food">
        <label for="event-start">시작 날짜:</label>
        <input type="text" id="event-start" name="event-start" disabled>
        <label for="event-end">종료 날짜:</label>
        <input type="text" id="event-end" name="event-end">
        <button id="save-event">저장</button>
        <button id="cancel-event">취소</button>
    </div>
    <!-- 모달 창 스타일 -->
    <style>
        /* 모달 대화 상자 스타일 */
        #event-dialog {
            display: none;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            max-width: 400px;
            margin: 0 auto;
            padding: 20px;
            position: relative;
            text-align: left;
        }

        /* 모달 버튼 스타일 */
        #event-dialog button {
            background-color: #007bff;
            border: none;
            border-radius: 5px;
            color: #fff;
            cursor: pointer;
            margin-top: 10px;
            padding: 10px 20px;
        }
    </style>

event_modal.html 수정 (카테고리 추가)

📂 event_modal.html 수정 (카테고리 추가)
    <div id="event-dialog" title="이벤트 정보 입력">
        <label for="event-food">음식 이름</label>
        <input type="text" id="event-food" name="event-food">
        <label for="event-start">시작 날짜</label>
        <input type="text" id="event-start" name="event-start" disabled>
        <label for="event-end">소비기한 마감일</label>
        <input type="text" id="event-end" name="event-end" disabled>
        <label for="category">카테고리</label> <br>
        <select id="category" name="category">
            <option value="food" selected>재료</option>
            <option value="no-food">비재료</option>
        </select>
    </div>

views.py 수정 (카테고리 추가)

📂 views.py 수정 (카테고리 추가)
# 이벤트를 추가할 때 동작하는 함수
@login_required
def add_event(request):
    # 요청으로부터 데이터 가져오기
    title = request.GET.get("title", None)
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    f_category = request.GET.get("f_category", None)  # f_category 값 가져오기

    # 새로운 이벤트 객체 생성 및 저장
    event = Events(
        name=str(title),
        start=start,
        end=end,
        f_category=f_category,  # 카테고리 설정
        user=request.user
    )
    event.save()

    # JSON 응답 반환
    data = {'id': event.id}  # 생성된 이벤트의 ID를 응답 데이터에 포함
    return JsonResponse(data)

JS 코드 수정

<// 날짜를 선택할 때
        select: function (start, end, allDay) {
            var foodName = "";
            var startDate = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
            var endDate = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");

            // 모달 대화 상자 열기
            $("#event-food").val("");
            $("#event-start").val(startDate);
            $("#event-end").val(endDate);
            var category = $("#category").val(); // 카테고리


            $("#event-dialog").dialog({
                title: '이벤트 정보 입력',
                buttons: {
                    '저장': function () {
                        foodName = $("#event-food").val();
                        startDate = $("#event-start").val();
                        endDate = $("#event-end").val();
                        var category = $("#category").val(); // 선택한 카테고리 값 가져오기

                        // 서버로 이벤트 데이터 전송
                        $.ajax({
                            type: "GET",
                            url: '/add_event',
                            data: {'title': foodName, 'start': startDate, 'end': endDate, 'f_category': category}, // 카테고리 정보 추가
                            dataType: "json",
                            success: function (data) {
                                calendar.fullCalendar('refetchEvents');
                                alert("이벤트 등록 완료!");
                                $("#event-dialog").dialog('close');
                            },
                            error: function (data) {
                                alert('문제가 발생하였습니다');
                            }
                        });
                    },
                    '취소': function () {
                        $("#event-dialog").dialog('close');
                    }
                },
                close: function () {
                    // 다이얼로그가 닫힐 때 입력 값 초기화
                    $("#event-food").val("");
                    $("#event-start").val("");
                    $("#event-end").val("");
                },
                modal: true
            });
        },

ISSUE

① 외래키로 유저 추가 과정에서 오류 발생

📂 calender/models.py
	# 추가
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, default=null)

'user_id'는 일반적으로 Django에서 ForeignKey로 관계형 필드를 정의할 때 생성되는 기본적인 필드 이름입니다. 이 이름은 ForeignKey로 연결된 모델의 이름과 "_id"가 조합되어 자동으로 생성됩니다. 이 관계로 'Events' 모델의 각 이벤트는 'User' 모델과 연결됩니다. ForeignKey로 정의된 필드의 이름은 일반적으로 연결된 모델의 이름과 "_id"가 조합되어 자동으로 생성됩니다. 따라서 'user' 필드가 'Events' 모델에서 정의되면 해당 필드의 데이터베이스 컬럼 이름은 'user_id'가 됩니다. 이것은 Django의 관례에 따라 자동 생성되는 이름입니다. 이 컬럼은 외래 키 제약 조건을 나타내며 'Events' 모델의 각 레코드가 'User' 모델의 특정 사용자와 관련되어 있음을 나타냅니다.

지금보니 밑에 분처럼 마이그레이션 파일이 적용이 안되고 계속 마이그레이션 파일만 주구장창 만들다가 발생한 에러임은 알겠으나 내부적인 이유는 제대로 모르겠다..

내가 찾아보니 다들 마이그레이션 파일을 적용해 놓은 것을 취소하고 새로 마이그레이션 파일을 만드는 것 같다.


https://phin09.tistory.com/59 (출처)


ValueError: Field 'id' expected a number but got 'None'.

이 오류는 모델 클래스의 객체를 저장하려고 할 때 해당 객체의 기본 키(primary key) 필드에 None 값을 할당하려고 할 때 발생합니다. 이 오류는 모델 객체를 생성하거나 수정할 때 모델의 필드 값이 올바르게 설정되지 않았을 때 주로 발생합니다.

여기서 주목해야 할 부분은 Events 모델 클래스의 user 필드에 기본값(default)으로 None을 설정한 부분입니다. default=None은 user 필드에 기본값으로 None을 허용하도록 정의한 것이지만, 이 필드가 외래 키(ForeignKey)로 설정되어 있기 때문에 None 값은 허용되지 않습니다. ForeignKey 필드는 연결된 모델의 기본 키(primary key) 값을 참조해야 하므로, None 값이 아닌 유효한 사용자(User)의 기본 키 값을 가져야 합니다.

해결

유저별로 캘린더를 만들려면 로그인한 사용자에 따라 캘린더 이벤트를 관리해야 합니다. 로그인하지 않은 사용자에게도 캘린더를 표시하고 싶다면, "익명 사용자(AnonymousUser)"에 대한 캘린더를 관리할 수 있습니다. 이를 위해 Django는 익명 사용자를 위한 고유한 기본 키 값을 제공합니다.

Django의 User 모델에 있는 AnonymousUser라는 클래스 이용
이 클래스는 로그인하지 않은 사용자를 나타내며, User 모델과 유사한 속성과 메서드를 가지고 있습니다. 로그인하지 않은 사용자에 대한 고유한 기본 키 값은 AnonymousUser 객체를 사용하여 관리할 수 있습니다.

따라서 Events 모델의 user 필드를 User 모델과 연결하고, 로그인하지 않은 사용자를 위한 기본값을 AnonymousUser로 설정
이렇게 하면 로그인한 사용자는 자신의 캘린더를 관리하고, 로그인하지 않은 사용자에게도 캘린더를 표시할 수 있습니다.

로그인 정보가 event 추가할 때 같이 안들어가고 NULL로 뜸

너 왜 null?

user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

에서

user = models.ForeignKey(User, on_delete=models.CASCADE)

로 변경 시도!

 (venv) PS C:\django_calender\django_calender> python manage.py makemigrations
It is impossible to change a nullable field 'user' on events to non-nullable without providing a default. This is because the database needs something to populate existing rows.
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)        
 2) Ignore for now. Existing rows that contain NULL values will have to be handled manually, for example with a RunPython or RunSQL operation.
 3) Quit and manually define a default value in models.py.

사실 이 문제를 근본적으로 해결해주는 것이 아니기 때문에 makemigrations를 안했음

해결책 : views.py에서 이벤트 추가시 DB에 user 정보를 자동으로 넣어주는 파일이 없었던 거라서 넣어줌

📂calender/views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.http import JsonResponse
from calender.models import Events

def index(request):
    # 사용자가 로그인했는지 확인합니다.
    if request.user.is_authenticated:
        # 로그인한 사용자의 이벤트만 필터링합니다.
        user_events = Events.objects.filter(user=request.user)
    else:
        # 비로그인 사용자에게는 이벤트를 보여주지 않습니다.
        user_events = Events.objects.none()

    context = {
        "events": user_events,
    }
    return render(request, 'calendar.html', context)



def all_events(request):
    all_events = Events.objects.all()
    out = []
    for event in all_events:
        out.append({
            'title': event.name,
            'id': event.id,
            'start': event.start.strftime("%m/%d/%Y, %H:%M:%S"),
            'end': event.end.strftime("%m/%d/%Y, %H:%M:%S"),
            # 이 코드를 통해 유저 아이디 정보가 들어옴!!!!!!!!!!!!!!!!!!!
            'user_id': request.user.id  # 로그인한 사용자의 ID를 넣어줍니다.
        })

    return JsonResponse(out, safe=False)


@login_required
def add_event(request):
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    title = request.GET.get("title", None)

    event = Events(name=str(title), start=start, end=end, user=request.user)
    event.save()

    data = {}
    return JsonResponse(data)

def update(request):
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    title = request.GET.get("title", None)
    id = request.GET.get("id", None)
    event = Events.objects.get(id=id)
    event.start = start
    event.end = end
    event.name = title
    event.save()
    data = {}
    return JsonResponse(data)


def remove(request):
    id = request.GET.get("id", None)
    event = Events.objects.get(id=id)
    event.delete()
    data = {}
    return JsonResponse(data)

view의 에러 처리가 사이트에 적용이 안됐던 이유

로그인하지 않은 사용자가 이벤트 관련 요청을 할 때 "There is a problem!!!" 메시지가 표시되는 것은 login_required 데코레이터가 AJAX 요청에 대해서도 작동하기 때문입니다. 로그인하지 않은 상태에서 /all_events, /add_event, /update, /remove 등의 URL로 AJAX 요청을 하면, login_required 데코레이터가 이를 차단하고 로그인 페이지로 리다이렉션하려고 합니다. 그러나 AJAX 요청은 리다이렉션을 처리할 수 없기 때문에, 이를 오류로 간주하고 error 콜백 함수가 실행되어 알림 메시지가 나타납니다.

클라이언트 사이드(JavaScript)에서 로그인 여부를 확인하지 않고 AJAX 요청을 보내기 때문에, 서버 측에서 거부되었을 때 오류 처리 콜백이 실행되는 것입니다.

이 문제를 해결하려면, 서버 측에서 로그인하지 않은 사용자가 요청을 보낼 때 적절한 HTTP 상태 코드와 함께 응답을 보내고, 클라이언트 사이드에서는 이 상태 코드를 확인하여 사용자에게 적절한 메시지를 표시하는 방법으로 처리할 수 있습니다.

서버 측에서 로그인 여부에 따라 다른 상태 코드를 반환하도록 하려면 다음과 같이 수정할 수 있습니다:


WARNINGS:
allauth.EmailAddress: (models.W036) MySQL does not support unique constraints with conditions.
        HINT: A constraint won't be created. Silence this warning if you don't care about it.
Operations to perform:
  Apply all migrations: admin, auth, calender, contenttypes, sessions, sites, socialaccount
Running migrations:
  Applying calender.0012_events_user...Traceback (most recent call last):

이런 경고 메세지 봄
.......
해결 못 함 엉엉 .... -> git revert를 통한 이전 커밋으로 되돌리기....
커밋은 작업별로 하자...
잘된다고 자만하지 말자...

공부한 것

git reset : 해당 버전으로 돌아가면 그 뒤 내용은 모두 지워짐

https://lucas-owner.tistory.com/35
https://han-joon-hyeok.github.io/posts/git-reset-revert/

            /* 날짜를 선택할 때
            select: function (start, end, allDay) {
                var foodName = "";
                var startDate = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
                var endDate = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");

                // 모달 대화 상자 열기
                $("#event-food").val("");
                $("#event-start").val(startDate);
                $("#event-end").val(endDate);

                $("#event-dialog").dialog({
                    title: '이벤트 정보 입력',
                    buttons: {
                        '저장': function () {
                            foodName = $("#event-food").val();
                            startDate = $("#event-start").val();
                            endDate = $("#event-end").val();

                            // 서버로 이벤트 데이터 전송
                            $.ajax({
                                type: "GET",
                                url: '/add_event',
                                data: {'title': foodName, 'start': startDate, 'end': endDate},
                                dataType: "json",
                                success: function (data) {
                                    calendar.fullCalendar('refetchEvents');
                                    alert("Added Successfully");
                                    $("#event-dialog").dialog('close');
                                },
                                error: function (data) {
                                    alert('There is a problem!!!');
                                }
                            });
                        },
                        '취소': function () {
                            $("#event-dialog").dialog('close');
                        }
                    },
                    close: function () {
                        // 다이얼로그가 닫힐 때 입력 값 초기화
                        $("#event-food").val("");
                        $("#event-start").val("");
                        $("#event-end").val("");
                    },
                    modal: true
                });
            }, */
profile
컴퓨터정보과

0개의 댓글