코딩 개발일지

장고 수정하기 에러 / 이미지파일 추가 본문

AI 본 교육/AI 5주차

장고 수정하기 에러 / 이미지파일 추가

호기호 2023. 9. 6. 19:45

수정하기 기능을 만드는데 자꾸 에러가 났다..ㅜㅜ

urls.py, models.py, update.html 는 전부 다 완벽했고, 문제가 생겼다면 분명히 views.py의 함수에서 잘못된 것이다!!

 

views.py에 내가 쓴 update 함수

@csrf_exempt
def update(request, todo_id):
    if request.method == "POST":
        if request.user == todo.user:
            todo = Todo.objects.get(id=todo_id)
            todo.content = request.POST['content']
            todo.save()
            return redirect(f'/todo/{todo_id}/')
        else:
            return HttpResponse('not allowed to update', status=403)
    elif request.method == "GET":
        todo = Todo.objects.get(id=todo_id)
        context = {
            'todo': todo,
        }
        return render(request, "todo/update.html", context)
    else:
        return HttpResponse('Invalid request method', status=405)

뭐가 문제였을까? 

이런 화면이 나왔다. 읽어보니, 역시 views.py에서 if request.user == todo.user에서 잘못 됨

반나절동안 이 에러때문에 끙끙댔는데, 지금 보니 다 알려주는데 왜 몰랐을까...

하여튼..저게 왜 잘못된걸까?

if request.user == Todo.user:

if문에서 todo.user가 정의되지않았다고 생각해서 이렇게 바꿔봤는데, 에러가 고쳐졌다.

하지만, 이렇게 쓰니 if문을 안돌고 바로 else로 가서

        else:
            return HttpResponse('not allowed to update', status=403)

만 출력하게 된다...

그래 models.py의 Todo.user 랑 requset.user는 항상 같지 않잖아.

그러면 todo.user를 if문 전에 정의를 하고 if문을 돌려야 하네!!!!! 라는 결론이 나와서 해결했음

@csrf_exempt
def update(request, todo_id):
    if request.method == "POST":
        todo = Todo.objects.get(id=todo_id)
        if request.user == todo.user:
            todo.content = request.POST['content']
            todo.save()
            return redirect(f'/todo/{todo_id}/')
        else:
            return HttpResponse('not allowed to update', status=403)
    elif request.method == "GET":
        todo = Todo.objects.get(id=todo_id)
        context = {
            'todo': todo,
        }
        return render(request, "todo/update.html", context)
    else:
        return HttpResponse('Invalid request method', status=405)

이렇게 하니 해결됨


settings.py에

MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR / "media"

를 추가해줘서 이미지파일을 업로드하면, 해당 이미지파일이 media 폴더에 저장되도록 만들어준다.

 

이미지파일을 업로드 할때, 용량이 크기때문에

 enctype="multipart/form-data"

를 추가해 줘야한다.

<form action='/todo/create/' method='post' enctype="multipart/form-data">
        {% csrf_token %}
        <input type='text' name='content' id='content'>
        <input type="file" name="image" >
        <button type='submit'> 만들기 </button>
    </form>

models.py에서도 class안에 image를 넣어서 migrate해서 데이터베이스에 넣어준다

image = models.ImageField(blank=True, null=True)

프로젝트 협업 해서 장고를 만들 때의 순서

1. pigma로 팀원들과 프로젝트를 구상한다.

2. erd를 만든다. https://www.erdcloud.com/

 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

3. 필요한 app들을 생성

4. model 정의 후 database 만들기 ( admin.py / models.py / settings.py 등)

5. admin페이지 만들기

6. urls, views, templates 등 만들어서 app 만들기

7. Thunder Client 같은 걸로 api로 테스트

8.  templates 꾸미기 (프론트엔드)

 

이러한 과정을 장고(Django)의 MVT 패턴(Model-View-Template) 이라고 한다.


 

vscode liveshare 활용해보는것도 고려해 볼것 !!

 

나중에는 django로 백엔드만 만들고, 프론트엔드는 따로 repository를 만들어서 관리하기때문에, 백엔드에 집중적으로 하는걸 추천

django에서 더 배우면 좋은것