[TIL] Django form, admin 등 활용하며 익숙해지기
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 }}
...
느낀점:
과연 나는 발전하고 있는가....
한 번 해본 것을 활용하고 반복 연습할 시간이 너무 부족해..ㅠㅠ