카테고리 없음

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

째깍단 2023. 4. 9. 02:34

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 }}
    ...

 

 

 


느낀점:

 

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

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