본문 바로가기
카테고리 없음

[TIL] Django form, admin 등 활용하며 익숙해지기

by 째깍단 2023. 4. 9.

1. 장고의 form, 대체 무엇일까

 

받은 form 예제 코드와 form의 기능을 살펴보다 보니

html을 이해해야 form에 대한 이해가 가능할 것이라는 생각이 든다..

 

 

문서를 따라 간단한 html을 만들어보자.

 

 

<form action="/sign-in/" method="post">
    <label for="signin"> 상품관리 : 로그인 </label> 
    <input id="user.id" type="text" name="user.id" value="id">
    <input id="user.password" type="text" name="user.password" value="password">
    <input type="submit" value="OK">
</form>

 

결과물 :

 

 

한 줄로 떠서 보기 어려우니

div로 구역을 나누고, type="password"로 가려보았다.

 

<form action="/sign-in/" method="post">
    <label for="signin"> 상품관리 : 로그인 </label>
    <div>
        <input id="user.id" type="text" name="user.id" value="id">
    </div>
    <div>
        <input id="user.password" type="password" name="user.password" value="password">
    </div>
    <input type="submit" value="OK">
</form>

결과물 :

 

 

이제 장고의 Form을 다시 알아보자.

 

form.py를 만들어 Form class를 설정하고, 

form.Form  /  form.ModelForm으로 일반, 모델 폼을 상속받아 적용하는 방식이다.

  • Form (일반 폼) : 직접 필드를 정의, 위젯 설정이 필요하다
  • Model Form (모델 폼) : 모델과 필드를 지정하면 모델폼이 자동으로 폼 필드를 생성해준다

 

Models.py에서 만든 모델의 정보들을 Form class 의 fields=[]에 입력하고,

적절한 html파일에 {{ form }}을 넣어주는 것 만으로 간단히 템플릿을 작성할 수 있다.

 

form을 사용하는 것 만으로 잘 모르는 html 내용을 끙끙 거리며 작성할 필요가 없다는 것이 가장 큰 장점이다!

 

 

 

 

2. 로그인이 필요한 페이지를 띄우려고 할때 404 에러가난 경우 = Today'sError 01

 

@login required에 login_url을 넣지 않고 사용하면 

장고에 기본세팅되어있는 settings.LOGIN_URL 인 /accounts/login으로 이동한다. 

 

그런데 /accounts/login 경로를 정의해두지 않았으므로 404에러 페이지를 보게된다.

나의 login 페이지로 이동시키려면 아래와 같이 login_url에 나의 로그인 경로를 넣는다.

 

@login_required(login_url="/sign-in/")

 

그런데 모든 데코레이터에 login_url을 추가하는 것보다 나은 방법이있다.

프로젝트 전체에 적용하는 방법을 사용하는 것.

 

settings.py 파일에 LOGIN_URL을 추가한다.

LOGIN_URL = '/sign-in/'

 

참조: 

https://docs.djangoproject.com/en/4.2/topics/auth/default/#the-login-required-decorator

 

 

 

 

 

3. admin 페이지에 등록한 정보 내용 띄우기

 

만든 model을  __str__메서드로 self.name을 전달하게 되면

admin 페이지에서 등록한 모델의 이름을 볼 수 있게 된다.

 

여기서 이름 외의 등록 내용을 보고 싶다면 2가지 방법이 있다..

 

 

 

1) __str__ 메서드 조작

 

string이어야하므로 f스트링을 사용한다.

return f'Product({self.name}, price={self.price}, stock={self.stock}, updated_at={self.updated_at})'

 

 

 

2) admin.py에 아래 class를 추가해준다.

 

class ProductAdmin(admin.ModelAdmin):
    list_display = ['code', 'name', 'size', 'price', 'stock', 'user']

 

admin.site.register(ProductModel, ProductAdmin)

register에 넣어주어야 list_display가 적용된다.!

 

 

 

 

4. 사용자에게 에러 메시지 띄우기

 

 

등록 폼에서 같은 이름을 등록하거나, 값을 잘못 설정하는 오류가 날 경우

render로 사용자에게 오류 수정을 권할 수 있다. 

 

 

1) message 변수에 오류 시 보여줄 문자열을 넣어주고

 

2) render의 context에 {'errormessage' : message}를 추가한다.

 

3) html의 오류 메세지를 보여줄 부분에 구역을 설정하고 {{ error_message }}를 불러오도록 한다.

 

<form action="/product_register/" , method="post">
    {%csrf_token%}
    <div>
        {{ error_message }}
    </div>
    <div>
        {{ form }}
    ...

 

 

 


느낀점:

 

과연 나는 발전하고 있는가....

한 번 해본 것을 활용하고 반복 연습할 시간이 너무 부족해..ㅠㅠ