In this assignment, you will create a small Django application given detailed specification of the overall app structure, views, and URLs.

You are to create two models for this assignment: Bank and Branch.

Bank:
A bank has a name, swift code, institution number, and description. All of them are strings that do not exceed 200 characters and cannot be null. Moreover, each bank has an owner that points to Django's User model. A bank also has a set of branches.

Branch:
A branch has a name, transit number, and address, all of which are strings that do not exceed 200 characters and cannot be null. Moreover, every branch has an email (with its specific validations) which is by default set to admin@utoronto.ca . Each branch has a capacity (non-negative integer) that could be left unspecified. It should also have last\_modified, a field that stores the last modification time. The primary key for both models must remain the default auto-incrementing integers.

General note on forms:
For every endpoint, every time a URL is associated with both GET and POST, the following rule applies: The GET request expects an HTML form with the fields listed by the payload. That is, each payload field must appear as an  with the appropriate type and name.

Upon submission, a POST request should be sent to the same endpoint. If data is valid, the specific task should be fulfilled, and the user is redirected to the success URL. Otherwise, the same form must be rendered with relevant error messages listed in validation errors. Note that all user inputs (except for password) must be preserved so that the user will not have to re-enter everything again.

Furthermore, input types must adhere to the original field type of their models. For example, the password fields should be rendered with ; email fields should be rendered  and so on. However, this (or adding the required attribute to the form) is merely for UX purposes and has nothing to do with your backend. That is, your backend code must still check for the required fields and validations.

Note: Your code must be resilient to invalid/malicious requests. For example, the client might intentionally discard some fields and not send them (note that this is different from sending empty or blank values). Moreover, it can send additional fields that are not listed. In either case, your code must not break. That is, the server should not return a 500 INTERNAL SERVER ERROR. Instead, it should treat missing values as blanks and ignore extra fields.

HTTP status codes:
All requests should be responded to with an HTTP 200 OK status code unless otherwise specified. In case of redirects, your status code must be 302 FOUND. You must check for client errors in the following order: 401 UNAUTHORIZED, 404 NOT FOUND, 403 FORBIDDEN, and 405 Method Not Allowed. That is, for example, at the create branch view, if the request is not authenticated and the bank ID is invalid as well, you should return 401 UNAUTHORIZED. Your server must never return a 500 INTERNAL SERVER ERROR.

Note: for all error messages, the autotester will not check whether there is a period at the end of sentence.

Question 1:
You will start off with the authentication views. You are to implement views for register, login, and logout. You are very well allowed to use the default User model in Django. In fact, you are strongly advised against creating your own custom auth model as it may mess with Django's default User model. Moreover, why bother yourselves?

In this question, you are allowed to use function-based, class-based views, or generic CRUD views. You can also use any built-in tool that is already provided by Django.

Endpoint: /accounts/register/ 
Methods: GET, POST
Fields/payload: username, password1, password2, email, first\_name, last\_name
Success URL: /accounts/login/ 
Validation errors: (copy and paste the exact error message)
 The two password fields didn't match
 A user with that username already exists
 This password is too short. It must contain at least 8 characters
 Enter a valid email address
Username, password, and repeat password are required. If empty, show the following error above the problematic field: 
 This field is required
이 과제에서는 전체 앱 구조, 보기 및 URL에 대한 자세한 사양이 주어진 작은 Django 애플리케이션을 생성합니다.이 과제를 위해 두 가지 모델을 만들어야 합니다: 은행과 지점입니다.Bank:은행에는 이름, 스위프트 코드, 기관 번호 및 설명이 있습니다. 모두 200자를 초과하지 않는 문자열이며 null이 될 수 없습니다. 또한 각 은행에는 Django의 사용자 모델을 가리키는 소유자가 있습니다. 은행에는 지점 집합도 있습니다.지점:지점에는 이름, 트랜짓 번호 및 주소가 있으며, 모두 200자를 초과할 수 없고 null이 될 수 없는 문자열입니다. 또한 모든 브랜치에는 기본적으로 admin@utoronto.ca 으로 설정된 이메일(특정 유효성 검사 포함)이 있습니다. 각 브랜치에는 지정하지 않을 수 있는 용량(음수가 아닌 정수)이 있습니다. 또한 마지막 수정 시간을 저장하는 필드인 last\_modified가 있어야 합니다. 두 모델의 기본 키는 기본 자동 증가 정수로 유지되어야 합니다.양식에 대한 일반적인 참고 사항:모든 엔드포인트에 대해 URL이 GET 및 POST에 모두 연결될 때마다 다음 규칙이 적용됩니다: GET 요청은 페이로드에 나열된 필드가 있는 HTML 양식을 기대합니다. 즉, 각 페이로드 필드는 적절한 유형과 이름을 가진 an으로 표시되어야 합니다.제출 시 POST 요청은 동일한 엔드포인트로 전송되어야 합니다. 데이터가 유효하면 특정 작업이 완료되어야 하며 사용자는 성공 URL로 리디렉션됩니다. 그렇지 않으면 유효성 검사 오류에 나열된 관련 오류 메시지와 함께 동일한 양식이 렌더링되어야 합니다. 비밀번호를 제외한 모든 사용자 입력은 사용자가 모든 것을 다시 입력할 필요가 없도록 보존되어야 합니다.또한 입력 유형은 해당 모델의 원래 필드 유형을 준수해야 합니다. 예를 들어, 비밀번호 필드는 ; 이메일 필드는 ; 등으로 렌더링되어야 합니다. 그러나 이 작업(또는 양식에 필수 속성을 추가하는 작업)은 UX 목적일 뿐이며 백엔드와는 아무런 관련이 없습니다. 즉, 백엔드 코드에서 여전히 필수 필드와 유효성 검사를 확인해야 합니다.참고: 코드는 유효하지 않거나 악의적인 요청에 대해 복원력이 있어야 합니다. 예를 들어, 클라이언트가 일부 필드를 의도적으로 삭제하고 전송하지 않을 수 있습니다(이는 비어 있거나 빈 값을 전송하는 것과는 다릅니다). 또한 목록에 없는 추가 필드를 전송할 수도 있습니다. 어떤 경우든 코드가 깨지지 않아야 합니다. 즉, 서버가 500 INTERNAL SERVER ERROR를 반환해서는 안 됩니다. 대신 누락된 값을 공백으로 처리하고 추가 필드를 무시해야 합니다.HTTP 상태 코드:달리 명시되지 않는 한 모든 요청은 HTTP 200 OK 상태 코드로 응답해야 합니다. 리디렉션의 경우 상태 코드는 302 FOUND여야 합니다. 클라이언트 오류는 다음 순서로 확인해야 합니다: 401 권한 없음, 404 찾을 수 없음, 403 금지됨, 405 방법 허용되지 않음. 즉, 예를 들어 지점 만들기 보기에서 요청이 인증되지 않았고 은행 ID도 유효하지 않은 경우 401 UNAUTHORIZED를 반환해야 합니다. 서버에서 500 INTERNAL SERVER ERROR를 반환해서는 안 됩니다.참고: 모든 오류 메시지에 대해 자동 검사기는 문장 끝에 마침표가 있는지 여부를 확인하지 않습니다.질문 1:인증 뷰부터 시작하겠습니다. 등록, 로그인 및 로그아웃에 대한 보기를 구현해야 합니다. 장고에서 기본 사용자 모델을 사용해도 좋습니다. 사실, 사용자 정의 인증 모델을 만들면 Django의 기본 사용자 모델이 엉망이 될 수 있으므로 사용자 정의 인증 모델을 만들지 않는 것이 좋습니다. 게다가 왜 귀찮게 하나요?이 질문에서는 함수 기반, 클래스 기반 보기 또는 일반 CRUD 보기를 사용할 수 있습니다. 또한 Django에서 이미 제공하는 기본 제공 도구를 사용할 수도 있습니다.엔드포인트 /계정/등록/ 메서드: GET, POST필드/페이로드: 사용자 이름, 비밀번호1, 비밀번호2, 이메일, 이름\_이름, 성\_이름성공 URL: /accounts/login/ 유효성 검사 오류: (정확한 오류 메시지를 복사하여 붙여넣기) 두 개의 비밀번호 필드가 일치하지 않습니다. 해당 사용자 아이디를 가진 사용자가 이미 존재합니다. 비밀번호가 너무 짧습니다. 8자 이상이어야 합니다. 유효한 이메일 주소를 입력하세요.사용자 아이디, 비밀번호, 반복 비밀번호는 필수입니다. 비어 있으면 문제가 있는 필드 위에 다음 오류가 표시됩니다:  이 필드는 필수 입력입니다.