2012-01-29 5 views
15

Django 프로젝트에서 모델 유효성 검사와 입력 유효성 검사를 분리하는 것이 일반적입니까? 예를 들어, 사용자 이름이 이름 지정 기준에 맞는지 확인하는 것은 입력 유효성 검증이며, 사용자가 데이터베이스에 없는지 검증하는 것은 모델 레벨 유효성 검증입니다.Django에서 양식 입력과 모델 유효성 검사를 분리 하시겠습니까?

나는 동료 코드를보고 있었고 두 가지 유형의 유효성 검사를 양식 클래스 (forms.py)에 넣었습니다. 이것은 일반적인 설정입니까, 아니면 모델 또는 뷰에 모델 수준 유효성 검사가 표시되는 것이 더 일반적입니까?

ModelForm을 사용하는 것과 같은 더 좋은 방법이 있습니까? 차라리 장고에 익숙하지 않고이 상황에서 권장되는 패턴이 무엇인지 배우려고합니다.

답변

12

이것은 (나를 위해) 매우 흥미로운 질문입니다.

제 생각에는 모든 유효성 검사 코드를 모델 코드로 옮겨야합니다. 비즈니스 규칙을 위반하지 않는 방법입니다. 유효성 검사 코드가 모델에있는 경우 새 양식에서 일부 유효성 검사를 잊어 버리거나 여러 양식에서 일관성없는 규칙을 가질 수 없습니다.

나는 당신에게 당신과 관련된 질문 인 'Django, Raise a validation error in a model's save method'에 링크되어 있습니다. 아래에서 양식에서 코드 확인을 모델로 이동하는 방법을 확인할 수 있습니다. 이 간단한 소개가 도움이되기를 바랍니다.

어떤 프레임 워크에서 왔습니까? 환경에서 유효성 검사 규칙이 어떻게 기록됩니까?

+3

동의합니다. 대부분의 것들은 실제로 "모델 수준"검증으로 생각할 수 있습니다. 이름 지정 기준과 일치하지 않는 사용자 이름을 데이터베이스에 저장하지 않으려 고합니다. 양식과 양식이 다를 수 있으며 양식 자체에서 유효성을 검사하려는 부분이 있습니다. 필드에 파일 형식을 포함하는 멋진 파일 모델이있을 수 있습니다. 모든 유형은 모델 수준에서는 정상이지만 사진 업로드 양식에서는 png 및 jpeg로 제한하려고합니다. – dokkaebi

8

허용되는 답변에 동의하지 않습니다. 모델의 불일치를 피하기 위해 모델 수준의 유효성 검사를 사용하고 사이트 별 제한 사항에 대해서는 양식 수준의 유효성 검사를 선호합니다.

이벤트에 대한 모델이 있고 시작 시간과 종료 시간이 datetime 인 필드가 있다고 가정합니다. 모델 유효성 검사는 시작 시간 이후에 종료 시간을 갖게합니다. 그러나 새로 만든 이벤트가 과거가 아니라는 것을 확인하는 형식으로 남겨 두었습니다. 따라서 과거에 발생한 이벤트를 추가해야하는 경우 과거 날짜를 허용하는 관리자 별 양식을 사용하거나 간단히 데이터베이스에 추가 할 수 있습니다.

따라서 모델 유효성 검증은 명백하게 잘못된 값만 검사해야합니다. 하지만 봇키 (예를 들어, 봇의 사용자 이름에 유니 코드 문자)을해야 할 필요가 있다면 관리자 나 셸을 통해서만 가능합니다. StackOverflow에서 항상 백엔드 코드에서 양식을 사용하고 일관된 유효성 검사를 위해 form["field"] = "value"과 같은 코드로 필드를 채우는 대답을 읽었습니다.

+1

예제 시나리오에서는'event' 테이블에 userId 필드를 넣고 일부 그룹 사용자에게는 과거 날짜로 채우기 폼을 허용 할 수 있습니다. 게시 한 각 예제에 대해 이와 같은 반증 예제를 찾을 수 있습니다.) 그러나 이것은 나의 접근 방식이며, 일부 규칙보다 폼 검증이 최상의 솔루션이 될 것입니다. – danihp

+0

물론 모델에서 구현할 수도 있지만, 기능 대신 기능을 폼으로 사용해야합니다. 다른 곳에서 블로그 모델을 다시 사용하려면 게시물이 "admin"그룹의 사용자에게 속하는 경우 왜주의해야합니까? 이 요구 사항은 한 사이트에서 다른 사이트로 변경 될 수 있으므로 모델 자체가 아닌 양식으로 유지하는 것이 가장 좋습니다. – sleblanc

+0

아마도 앞으로는 웹 앱에 전체 휴식 API가 제공 될 것입니다. 단지 예일뿐입니다. 공유에 대해 감사드립니다 귀하의 commet, 오신 것을 환영합니다. – danihp

관련 문제