[{"data":1,"prerenderedAt":11590},["ShallowReactive",2],{"navigation":3,"/forms-and-user-input/form-validation":1016,"/forms-and-user-input/form-validation-surround":11585},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":230,"body":1018,"description":1028,"extension":11580,"links":11581,"meta":11582,"navigation":1105,"path":231,"seo":11583,"stem":232,"__hash__":11584},"docs/06.forms-and-user-input/05.form-validation.md",{"type":1019,"value":1020,"toc":11559},"minimark",[1021,1025,1029,1034,1039,2822,2826,2830,3555,3559,4622,4626,4630,7080,7084,7088,8785,8789,8793,10322,10326,10330,11552,11555],[1022,1023,230],"h1",{"id":1024},"form-validation",[1026,1027,1028],"p",{},"Django's form validation system provides multiple layers of data validation, from field-level checks to complex form-wide business rules. Understanding validation patterns enables you to build robust forms that ensure data integrity and provide meaningful user feedback.",[1030,1031,1033],"h2",{"id":1032},"validation-hierarchy","Validation Hierarchy",[1035,1036,1038],"h3",{"id":1037},"understanding-validation-flow","Understanding Validation Flow",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# forms.py - Validation flow demonstration\nfrom django import forms\nfrom django.core.exceptions import ValidationError\n\nclass ComprehensiveValidationForm(forms.Form):\n    \"\"\"Form demonstrating the complete validation hierarchy\"\"\"\n    \n    username = forms.CharField(max_length=30)\n    email = forms.EmailField()\n    password = forms.CharField(widget=forms.PasswordInput)\n    confirm_password = forms.CharField(widget=forms.PasswordInput)\n    age = forms.IntegerField()\n    \n    def clean_username(self):\n        \"\"\"Step 1: Field-level validation\"\"\"\n        username = self.cleaned_data['username']\n        \n        print(f\"1. Field validation for username: {username}\")\n        \n        # Length validation\n        if len(username) \u003C 3:\n            raise ValidationError('Username must be at least 3 characters long.')\n        \n        # Character validation\n        if not username.isalnum():\n            raise ValidationError('Username must contain only letters and numbers.')\n        \n        # Availability check\n        from django.contrib.auth.models import User\n        if User.objects.filter(username=username).exists():\n            raise ValidationError('This username is already taken.')\n        \n        return username\n    \n    def clean_email(self):\n        \"\"\"Step 1: Field-level validation for email\"\"\"\n        email = self.cleaned_data['email']\n        \n        print(f\"1. Field validation for email: {email}\")\n        \n        # Domain validation\n        allowed_domains = ['gmail.com', 'yahoo.com', 'company.com']\n        domain = email.split('@')[1]\n        if domain not in allowed_domains:\n            raise ValidationError(f'Email domain {domain} is not allowed.')\n        \n        return email\n    \n    def clean_password(self):\n        \"\"\"Step 1: Field-level validation for password\"\"\"\n        password = self.cleaned_data['password']\n        \n        print(f\"1. Field validation for password\")\n        \n        # Length check\n        if len(password) \u003C 8:\n            raise ValidationError('Password must be at least 8 characters long.')\n        \n        # Complexity check\n        if password.isdigit():\n            raise ValidationError('Password cannot be entirely numeric.')\n        \n        # Common password check\n        common_passwords = ['password', '12345678', 'qwerty', 'abc123']\n        if password.lower() in common_passwords:\n            raise ValidationError('Password is too common.')\n        \n        return password\n    \n    def clean_age(self):\n        \"\"\"Step 1: Field-level validation for age\"\"\"\n        age = self.cleaned_data['age']\n        \n        print(f\"1. Field validation for age: {age}\")\n        \n        if age \u003C 13:\n            raise ValidationError('You must be at least 13 years old.')\n        \n        if age > 120:\n            raise ValidationError('Please enter a realistic age.')\n        \n        return age\n    \n    def clean(self):\n        \"\"\"Step 2: Form-level validation\"\"\"\n        cleaned_data = super().clean()\n        \n        print(\"2. Form-level validation\")\n        \n        password = cleaned_data.get('password')\n        confirm_password = cleaned_data.get('confirm_password')\n        username = cleaned_data.get('username')\n        \n        # Password confirmation\n        if password and confirm_password:\n            if password != confirm_password:\n                raise ValidationError('Passwords do not match.')\n        \n        # Username-password similarity\n        if username and password:\n            if username.lower() in password.lower():\n                raise ValidationError('Password cannot contain the username.')\n        \n        return cleaned_data\n    \n    def full_clean(self):\n        \"\"\"Step 3: Complete form validation (rarely overridden)\"\"\"\n        print(\"3. Full form validation\")\n        super().full_clean()\n        \n        # Additional business logic validation\n        self._validate_business_rules()\n    \n    def _validate_business_rules(self):\n        \"\"\"Custom business rule validation\"\"\"\n        print(\"4. Business rules validation\")\n        \n        if hasattr(self, 'cleaned_data'):\n            username = self.cleaned_data.get('username')\n            email = self.cleaned_data.get('email')\n            \n            # Business rule: username cannot be part of email\n            if username and email and username in email:\n                self.add_error(None, 'Username cannot be part of email address.')\n","python","",[1047,1048,1049,1058,1075,1100,1107,1133,1147,1153,1186,1204,1235,1263,1280,1285,1303,1314,1347,1353,1382,1387,1393,1419,1439,1444,1450,1469,1487,1492,1498,1526,1560,1578,1583,1592,1597,1611,1621,1646,1651,1673,1678,1684,1724,1757,1776,1802,1807,1815,1820,1834,1844,1869,1874,1888,1893,1899,1919,1937,1942,1948,1963,1981,1986,1992,2037,2059,2077,2082,2090,2095,2109,2119,2144,2149,2171,2176,2192,2210,2215,2230,2248,2253,2261,2266,2280,2290,2310,2315,2331,2336,2361,2386,2409,2414,2420,2436,2451,2470,2475,2481,2495,2518,2536,2541,2549,2554,2568,2578,2594,2607,2612,2618,2631,2636,2650,2660,2676,2681,2703,2731,2759,2765,2771,2794],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# forms.py - Validation flow demonstration\n",[1050,1059,1061,1065,1069,1072],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"siDh9","from",[1050,1066,1068],{"class":1067},"sftqT"," django ",[1050,1070,1071],{"class":1063},"import",[1050,1073,1074],{"class":1067}," forms\n",[1050,1076,1078,1080,1083,1087,1090,1092,1095,1097],{"class":1052,"line":1077},3,[1050,1079,1064],{"class":1063},[1050,1081,1082],{"class":1067}," django",[1050,1084,1086],{"class":1085},"soVBu",".",[1050,1088,1089],{"class":1067},"core",[1050,1091,1086],{"class":1085},[1050,1093,1094],{"class":1067},"exceptions ",[1050,1096,1071],{"class":1063},[1050,1098,1099],{"class":1067}," ValidationError\n",[1050,1101,1103],{"class":1052,"line":1102},4,[1050,1104,1106],{"emptyLinePlaceholder":1105},true,"\n",[1050,1108,1110,1114,1118,1121,1125,1127,1130],{"class":1052,"line":1109},5,[1050,1111,1113],{"class":1112},"s5Kfy","class",[1050,1115,1117],{"class":1116},"sD-vU"," ComprehensiveValidationForm",[1050,1119,1120],{"class":1085},"(",[1050,1122,1124],{"class":1123},"sYn-s","forms",[1050,1126,1086],{"class":1085},[1050,1128,1129],{"class":1123},"Form",[1050,1131,1132],{"class":1085},"):\n",[1050,1134,1136,1140,1144],{"class":1052,"line":1135},6,[1050,1137,1139],{"class":1138},"sm7ve","    \"\"\"",[1050,1141,1143],{"class":1142},"sVyVU","Form demonstrating the complete validation hierarchy",[1050,1145,1146],{"class":1138},"\"\"\"\n",[1050,1148,1150],{"class":1052,"line":1149},7,[1050,1151,1152],{"class":1067},"    \n",[1050,1154,1156,1159,1162,1165,1167,1171,1173,1177,1179,1183],{"class":1052,"line":1155},8,[1050,1157,1158],{"class":1067},"    username ",[1050,1160,1161],{"class":1085},"=",[1050,1163,1164],{"class":1067}," forms",[1050,1166,1086],{"class":1085},[1050,1168,1170],{"class":1169},"siWMO","CharField",[1050,1172,1120],{"class":1085},[1050,1174,1176],{"class":1175},"sqOPj","max_length",[1050,1178,1161],{"class":1085},[1050,1180,1182],{"class":1181},"s7CZa","30",[1050,1184,1185],{"class":1085},")\n",[1050,1187,1189,1192,1194,1196,1198,1201],{"class":1052,"line":1188},9,[1050,1190,1191],{"class":1067},"    email ",[1050,1193,1161],{"class":1085},[1050,1195,1164],{"class":1067},[1050,1197,1086],{"class":1085},[1050,1199,1200],{"class":1169},"EmailField",[1050,1202,1203],{"class":1085},"()\n",[1050,1205,1207,1210,1212,1214,1216,1218,1220,1223,1225,1227,1229,1233],{"class":1052,"line":1206},10,[1050,1208,1209],{"class":1067},"    password ",[1050,1211,1161],{"class":1085},[1050,1213,1164],{"class":1067},[1050,1215,1086],{"class":1085},[1050,1217,1170],{"class":1169},[1050,1219,1120],{"class":1085},[1050,1221,1222],{"class":1175},"widget",[1050,1224,1161],{"class":1085},[1050,1226,1124],{"class":1169},[1050,1228,1086],{"class":1085},[1050,1230,1232],{"class":1231},"sBPpx","PasswordInput",[1050,1234,1185],{"class":1085},[1050,1236,1238,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261],{"class":1052,"line":1237},11,[1050,1239,1240],{"class":1067},"    confirm_password ",[1050,1242,1161],{"class":1085},[1050,1244,1164],{"class":1067},[1050,1246,1086],{"class":1085},[1050,1248,1170],{"class":1169},[1050,1250,1120],{"class":1085},[1050,1252,1222],{"class":1175},[1050,1254,1161],{"class":1085},[1050,1256,1124],{"class":1169},[1050,1258,1086],{"class":1085},[1050,1260,1232],{"class":1231},[1050,1262,1185],{"class":1085},[1050,1264,1266,1269,1271,1273,1275,1278],{"class":1052,"line":1265},12,[1050,1267,1268],{"class":1067},"    age ",[1050,1270,1161],{"class":1085},[1050,1272,1164],{"class":1067},[1050,1274,1086],{"class":1085},[1050,1276,1277],{"class":1169},"IntegerField",[1050,1279,1203],{"class":1085},[1050,1281,1283],{"class":1052,"line":1282},13,[1050,1284,1152],{"class":1067},[1050,1286,1288,1291,1295,1297,1301],{"class":1052,"line":1287},14,[1050,1289,1290],{"class":1112},"    def",[1050,1292,1294],{"class":1293},"sljsM"," clean_username",[1050,1296,1120],{"class":1085},[1050,1298,1300],{"class":1299},"sRjD_","self",[1050,1302,1132],{"class":1085},[1050,1304,1306,1309,1312],{"class":1052,"line":1305},15,[1050,1307,1308],{"class":1138},"        \"\"\"",[1050,1310,1311],{"class":1142},"Step 1: Field-level validation",[1050,1313,1146],{"class":1138},[1050,1315,1317,1320,1322,1326,1328,1331,1334,1338,1342,1344],{"class":1052,"line":1316},16,[1050,1318,1319],{"class":1067},"        username ",[1050,1321,1161],{"class":1085},[1050,1323,1325],{"class":1324},"se3Ec"," self",[1050,1327,1086],{"class":1085},[1050,1329,1330],{"class":1231},"cleaned_data",[1050,1332,1333],{"class":1085},"[",[1050,1335,1337],{"class":1336},"sbYkP","'",[1050,1339,1341],{"class":1340},"sTbE_","username",[1050,1343,1337],{"class":1336},[1050,1345,1346],{"class":1085},"]\n",[1050,1348,1350],{"class":1052,"line":1349},17,[1050,1351,1352],{"class":1067},"        \n",[1050,1354,1356,1360,1362,1365,1368,1372,1374,1377,1380],{"class":1052,"line":1355},18,[1050,1357,1359],{"class":1358},"sJdAF","        print",[1050,1361,1120],{"class":1085},[1050,1363,1364],{"class":1112},"f",[1050,1366,1367],{"class":1340},"\"1. Field validation for username: ",[1050,1369,1371],{"class":1370},"s3h35","{",[1050,1373,1341],{"class":1169},[1050,1375,1376],{"class":1370},"}",[1050,1378,1379],{"class":1340},"\"",[1050,1381,1185],{"class":1085},[1050,1383,1385],{"class":1052,"line":1384},19,[1050,1386,1352],{"class":1067},[1050,1388,1390],{"class":1052,"line":1389},20,[1050,1391,1392],{"class":1056},"        # Length validation\n",[1050,1394,1396,1399,1402,1404,1406,1409,1413,1416],{"class":1052,"line":1395},21,[1050,1397,1398],{"class":1063},"        if",[1050,1400,1401],{"class":1358}," len",[1050,1403,1120],{"class":1085},[1050,1405,1341],{"class":1169},[1050,1407,1408],{"class":1085},")",[1050,1410,1412],{"class":1411},"sVsLi"," \u003C",[1050,1414,1415],{"class":1181}," 3",[1050,1417,1418],{"class":1085},":\n",[1050,1420,1422,1425,1428,1430,1432,1435,1437],{"class":1052,"line":1421},22,[1050,1423,1424],{"class":1063},"            raise",[1050,1426,1427],{"class":1169}," ValidationError",[1050,1429,1120],{"class":1085},[1050,1431,1337],{"class":1336},[1050,1433,1434],{"class":1340},"Username must be at least 3 characters long.",[1050,1436,1337],{"class":1336},[1050,1438,1185],{"class":1085},[1050,1440,1442],{"class":1052,"line":1441},23,[1050,1443,1352],{"class":1067},[1050,1445,1447],{"class":1052,"line":1446},24,[1050,1448,1449],{"class":1056},"        # Character validation\n",[1050,1451,1453,1455,1458,1461,1463,1466],{"class":1052,"line":1452},25,[1050,1454,1398],{"class":1063},[1050,1456,1457],{"class":1411}," not",[1050,1459,1460],{"class":1067}," username",[1050,1462,1086],{"class":1085},[1050,1464,1465],{"class":1169},"isalnum",[1050,1467,1468],{"class":1085},"():\n",[1050,1470,1472,1474,1476,1478,1480,1483,1485],{"class":1052,"line":1471},26,[1050,1473,1424],{"class":1063},[1050,1475,1427],{"class":1169},[1050,1477,1120],{"class":1085},[1050,1479,1337],{"class":1336},[1050,1481,1482],{"class":1340},"Username must contain only letters and numbers.",[1050,1484,1337],{"class":1336},[1050,1486,1185],{"class":1085},[1050,1488,1490],{"class":1052,"line":1489},27,[1050,1491,1352],{"class":1067},[1050,1493,1495],{"class":1052,"line":1494},28,[1050,1496,1497],{"class":1056},"        # Availability check\n",[1050,1499,1501,1504,1506,1508,1511,1513,1516,1518,1521,1523],{"class":1052,"line":1500},29,[1050,1502,1503],{"class":1063},"        from",[1050,1505,1082],{"class":1067},[1050,1507,1086],{"class":1085},[1050,1509,1510],{"class":1067},"contrib",[1050,1512,1086],{"class":1085},[1050,1514,1515],{"class":1067},"auth",[1050,1517,1086],{"class":1085},[1050,1519,1520],{"class":1067},"models ",[1050,1522,1071],{"class":1063},[1050,1524,1525],{"class":1067}," User\n",[1050,1527,1529,1531,1534,1536,1539,1541,1544,1546,1548,1550,1552,1555,1558],{"class":1052,"line":1528},30,[1050,1530,1398],{"class":1063},[1050,1532,1533],{"class":1067}," User",[1050,1535,1086],{"class":1085},[1050,1537,1538],{"class":1231},"objects",[1050,1540,1086],{"class":1085},[1050,1542,1543],{"class":1169},"filter",[1050,1545,1120],{"class":1085},[1050,1547,1341],{"class":1175},[1050,1549,1161],{"class":1085},[1050,1551,1341],{"class":1169},[1050,1553,1554],{"class":1085},").",[1050,1556,1557],{"class":1169},"exists",[1050,1559,1468],{"class":1085},[1050,1561,1563,1565,1567,1569,1571,1574,1576],{"class":1052,"line":1562},31,[1050,1564,1424],{"class":1063},[1050,1566,1427],{"class":1169},[1050,1568,1120],{"class":1085},[1050,1570,1337],{"class":1336},[1050,1572,1573],{"class":1340},"This username is already taken.",[1050,1575,1337],{"class":1336},[1050,1577,1185],{"class":1085},[1050,1579,1581],{"class":1052,"line":1580},32,[1050,1582,1352],{"class":1067},[1050,1584,1586,1589],{"class":1052,"line":1585},33,[1050,1587,1588],{"class":1063},"        return",[1050,1590,1591],{"class":1067}," username\n",[1050,1593,1595],{"class":1052,"line":1594},34,[1050,1596,1152],{"class":1067},[1050,1598,1600,1602,1605,1607,1609],{"class":1052,"line":1599},35,[1050,1601,1290],{"class":1112},[1050,1603,1604],{"class":1293}," clean_email",[1050,1606,1120],{"class":1085},[1050,1608,1300],{"class":1299},[1050,1610,1132],{"class":1085},[1050,1612,1614,1616,1619],{"class":1052,"line":1613},36,[1050,1615,1308],{"class":1138},[1050,1617,1618],{"class":1142},"Step 1: Field-level validation for email",[1050,1620,1146],{"class":1138},[1050,1622,1624,1627,1629,1631,1633,1635,1637,1639,1642,1644],{"class":1052,"line":1623},37,[1050,1625,1626],{"class":1067},"        email ",[1050,1628,1161],{"class":1085},[1050,1630,1325],{"class":1324},[1050,1632,1086],{"class":1085},[1050,1634,1330],{"class":1231},[1050,1636,1333],{"class":1085},[1050,1638,1337],{"class":1336},[1050,1640,1641],{"class":1340},"email",[1050,1643,1337],{"class":1336},[1050,1645,1346],{"class":1085},[1050,1647,1649],{"class":1052,"line":1648},38,[1050,1650,1352],{"class":1067},[1050,1652,1654,1656,1658,1660,1663,1665,1667,1669,1671],{"class":1052,"line":1653},39,[1050,1655,1359],{"class":1358},[1050,1657,1120],{"class":1085},[1050,1659,1364],{"class":1112},[1050,1661,1662],{"class":1340},"\"1. Field validation for email: ",[1050,1664,1371],{"class":1370},[1050,1666,1641],{"class":1169},[1050,1668,1376],{"class":1370},[1050,1670,1379],{"class":1340},[1050,1672,1185],{"class":1085},[1050,1674,1676],{"class":1052,"line":1675},40,[1050,1677,1352],{"class":1067},[1050,1679,1681],{"class":1052,"line":1680},41,[1050,1682,1683],{"class":1056},"        # Domain validation\n",[1050,1685,1687,1690,1692,1695,1697,1700,1702,1705,1708,1711,1713,1715,1717,1720,1722],{"class":1052,"line":1686},42,[1050,1688,1689],{"class":1067},"        allowed_domains ",[1050,1691,1161],{"class":1085},[1050,1693,1694],{"class":1085}," [",[1050,1696,1337],{"class":1336},[1050,1698,1699],{"class":1340},"gmail.com",[1050,1701,1337],{"class":1336},[1050,1703,1704],{"class":1085},",",[1050,1706,1707],{"class":1336}," '",[1050,1709,1710],{"class":1340},"yahoo.com",[1050,1712,1337],{"class":1336},[1050,1714,1704],{"class":1085},[1050,1716,1707],{"class":1336},[1050,1718,1719],{"class":1340},"company.com",[1050,1721,1337],{"class":1336},[1050,1723,1346],{"class":1085},[1050,1725,1727,1730,1732,1735,1737,1740,1742,1744,1747,1749,1752,1755],{"class":1052,"line":1726},43,[1050,1728,1729],{"class":1067},"        domain ",[1050,1731,1161],{"class":1085},[1050,1733,1734],{"class":1067}," email",[1050,1736,1086],{"class":1085},[1050,1738,1739],{"class":1169},"split",[1050,1741,1120],{"class":1085},[1050,1743,1337],{"class":1336},[1050,1745,1746],{"class":1340},"@",[1050,1748,1337],{"class":1336},[1050,1750,1751],{"class":1085},")[",[1050,1753,1754],{"class":1181},"1",[1050,1756,1346],{"class":1085},[1050,1758,1760,1762,1765,1768,1771,1774],{"class":1052,"line":1759},44,[1050,1761,1398],{"class":1063},[1050,1763,1764],{"class":1067}," domain ",[1050,1766,1767],{"class":1411},"not",[1050,1769,1770],{"class":1411}," in",[1050,1772,1773],{"class":1067}," allowed_domains",[1050,1775,1418],{"class":1085},[1050,1777,1779,1781,1783,1785,1787,1790,1792,1795,1797,1800],{"class":1052,"line":1778},45,[1050,1780,1424],{"class":1063},[1050,1782,1427],{"class":1169},[1050,1784,1120],{"class":1085},[1050,1786,1364],{"class":1112},[1050,1788,1789],{"class":1340},"'Email domain ",[1050,1791,1371],{"class":1370},[1050,1793,1794],{"class":1169},"domain",[1050,1796,1376],{"class":1370},[1050,1798,1799],{"class":1340}," is not allowed.'",[1050,1801,1185],{"class":1085},[1050,1803,1805],{"class":1052,"line":1804},46,[1050,1806,1352],{"class":1067},[1050,1808,1810,1812],{"class":1052,"line":1809},47,[1050,1811,1588],{"class":1063},[1050,1813,1814],{"class":1067}," email\n",[1050,1816,1818],{"class":1052,"line":1817},48,[1050,1819,1152],{"class":1067},[1050,1821,1823,1825,1828,1830,1832],{"class":1052,"line":1822},49,[1050,1824,1290],{"class":1112},[1050,1826,1827],{"class":1293}," clean_password",[1050,1829,1120],{"class":1085},[1050,1831,1300],{"class":1299},[1050,1833,1132],{"class":1085},[1050,1835,1837,1839,1842],{"class":1052,"line":1836},50,[1050,1838,1308],{"class":1138},[1050,1840,1841],{"class":1142},"Step 1: Field-level validation for password",[1050,1843,1146],{"class":1138},[1050,1845,1847,1850,1852,1854,1856,1858,1860,1862,1865,1867],{"class":1052,"line":1846},51,[1050,1848,1849],{"class":1067},"        password ",[1050,1851,1161],{"class":1085},[1050,1853,1325],{"class":1324},[1050,1855,1086],{"class":1085},[1050,1857,1330],{"class":1231},[1050,1859,1333],{"class":1085},[1050,1861,1337],{"class":1336},[1050,1863,1864],{"class":1340},"password",[1050,1866,1337],{"class":1336},[1050,1868,1346],{"class":1085},[1050,1870,1872],{"class":1052,"line":1871},52,[1050,1873,1352],{"class":1067},[1050,1875,1877,1879,1881,1883,1886],{"class":1052,"line":1876},53,[1050,1878,1359],{"class":1358},[1050,1880,1120],{"class":1085},[1050,1882,1364],{"class":1112},[1050,1884,1885],{"class":1340},"\"1. Field validation for password\"",[1050,1887,1185],{"class":1085},[1050,1889,1891],{"class":1052,"line":1890},54,[1050,1892,1352],{"class":1067},[1050,1894,1896],{"class":1052,"line":1895},55,[1050,1897,1898],{"class":1056},"        # Length check\n",[1050,1900,1902,1904,1906,1908,1910,1912,1914,1917],{"class":1052,"line":1901},56,[1050,1903,1398],{"class":1063},[1050,1905,1401],{"class":1358},[1050,1907,1120],{"class":1085},[1050,1909,1864],{"class":1169},[1050,1911,1408],{"class":1085},[1050,1913,1412],{"class":1411},[1050,1915,1916],{"class":1181}," 8",[1050,1918,1418],{"class":1085},[1050,1920,1922,1924,1926,1928,1930,1933,1935],{"class":1052,"line":1921},57,[1050,1923,1424],{"class":1063},[1050,1925,1427],{"class":1169},[1050,1927,1120],{"class":1085},[1050,1929,1337],{"class":1336},[1050,1931,1932],{"class":1340},"Password must be at least 8 characters long.",[1050,1934,1337],{"class":1336},[1050,1936,1185],{"class":1085},[1050,1938,1940],{"class":1052,"line":1939},58,[1050,1941,1352],{"class":1067},[1050,1943,1945],{"class":1052,"line":1944},59,[1050,1946,1947],{"class":1056},"        # Complexity check\n",[1050,1949,1951,1953,1956,1958,1961],{"class":1052,"line":1950},60,[1050,1952,1398],{"class":1063},[1050,1954,1955],{"class":1067}," password",[1050,1957,1086],{"class":1085},[1050,1959,1960],{"class":1169},"isdigit",[1050,1962,1468],{"class":1085},[1050,1964,1966,1968,1970,1972,1974,1977,1979],{"class":1052,"line":1965},61,[1050,1967,1424],{"class":1063},[1050,1969,1427],{"class":1169},[1050,1971,1120],{"class":1085},[1050,1973,1337],{"class":1336},[1050,1975,1976],{"class":1340},"Password cannot be entirely numeric.",[1050,1978,1337],{"class":1336},[1050,1980,1185],{"class":1085},[1050,1982,1984],{"class":1052,"line":1983},62,[1050,1985,1352],{"class":1067},[1050,1987,1989],{"class":1052,"line":1988},63,[1050,1990,1991],{"class":1056},"        # Common password check\n",[1050,1993,1995,1998,2000,2002,2004,2006,2008,2010,2012,2015,2017,2019,2021,2024,2026,2028,2030,2033,2035],{"class":1052,"line":1994},64,[1050,1996,1997],{"class":1067},"        common_passwords ",[1050,1999,1161],{"class":1085},[1050,2001,1694],{"class":1085},[1050,2003,1337],{"class":1336},[1050,2005,1864],{"class":1340},[1050,2007,1337],{"class":1336},[1050,2009,1704],{"class":1085},[1050,2011,1707],{"class":1336},[1050,2013,2014],{"class":1340},"12345678",[1050,2016,1337],{"class":1336},[1050,2018,1704],{"class":1085},[1050,2020,1707],{"class":1336},[1050,2022,2023],{"class":1340},"qwerty",[1050,2025,1337],{"class":1336},[1050,2027,1704],{"class":1085},[1050,2029,1707],{"class":1336},[1050,2031,2032],{"class":1340},"abc123",[1050,2034,1337],{"class":1336},[1050,2036,1346],{"class":1085},[1050,2038,2040,2042,2044,2046,2049,2052,2054,2057],{"class":1052,"line":2039},65,[1050,2041,1398],{"class":1063},[1050,2043,1955],{"class":1067},[1050,2045,1086],{"class":1085},[1050,2047,2048],{"class":1169},"lower",[1050,2050,2051],{"class":1085},"()",[1050,2053,1770],{"class":1411},[1050,2055,2056],{"class":1067}," common_passwords",[1050,2058,1418],{"class":1085},[1050,2060,2062,2064,2066,2068,2070,2073,2075],{"class":1052,"line":2061},66,[1050,2063,1424],{"class":1063},[1050,2065,1427],{"class":1169},[1050,2067,1120],{"class":1085},[1050,2069,1337],{"class":1336},[1050,2071,2072],{"class":1340},"Password is too common.",[1050,2074,1337],{"class":1336},[1050,2076,1185],{"class":1085},[1050,2078,2080],{"class":1052,"line":2079},67,[1050,2081,1352],{"class":1067},[1050,2083,2085,2087],{"class":1052,"line":2084},68,[1050,2086,1588],{"class":1063},[1050,2088,2089],{"class":1067}," password\n",[1050,2091,2093],{"class":1052,"line":2092},69,[1050,2094,1152],{"class":1067},[1050,2096,2098,2100,2103,2105,2107],{"class":1052,"line":2097},70,[1050,2099,1290],{"class":1112},[1050,2101,2102],{"class":1293}," clean_age",[1050,2104,1120],{"class":1085},[1050,2106,1300],{"class":1299},[1050,2108,1132],{"class":1085},[1050,2110,2112,2114,2117],{"class":1052,"line":2111},71,[1050,2113,1308],{"class":1138},[1050,2115,2116],{"class":1142},"Step 1: Field-level validation for age",[1050,2118,1146],{"class":1138},[1050,2120,2122,2125,2127,2129,2131,2133,2135,2137,2140,2142],{"class":1052,"line":2121},72,[1050,2123,2124],{"class":1067},"        age ",[1050,2126,1161],{"class":1085},[1050,2128,1325],{"class":1324},[1050,2130,1086],{"class":1085},[1050,2132,1330],{"class":1231},[1050,2134,1333],{"class":1085},[1050,2136,1337],{"class":1336},[1050,2138,2139],{"class":1340},"age",[1050,2141,1337],{"class":1336},[1050,2143,1346],{"class":1085},[1050,2145,2147],{"class":1052,"line":2146},73,[1050,2148,1352],{"class":1067},[1050,2150,2152,2154,2156,2158,2161,2163,2165,2167,2169],{"class":1052,"line":2151},74,[1050,2153,1359],{"class":1358},[1050,2155,1120],{"class":1085},[1050,2157,1364],{"class":1112},[1050,2159,2160],{"class":1340},"\"1. Field validation for age: ",[1050,2162,1371],{"class":1370},[1050,2164,2139],{"class":1169},[1050,2166,1376],{"class":1370},[1050,2168,1379],{"class":1340},[1050,2170,1185],{"class":1085},[1050,2172,2174],{"class":1052,"line":2173},75,[1050,2175,1352],{"class":1067},[1050,2177,2179,2181,2184,2187,2190],{"class":1052,"line":2178},76,[1050,2180,1398],{"class":1063},[1050,2182,2183],{"class":1067}," age ",[1050,2185,2186],{"class":1411},"\u003C",[1050,2188,2189],{"class":1181}," 13",[1050,2191,1418],{"class":1085},[1050,2193,2195,2197,2199,2201,2203,2206,2208],{"class":1052,"line":2194},77,[1050,2196,1424],{"class":1063},[1050,2198,1427],{"class":1169},[1050,2200,1120],{"class":1085},[1050,2202,1337],{"class":1336},[1050,2204,2205],{"class":1340},"You must be at least 13 years old.",[1050,2207,1337],{"class":1336},[1050,2209,1185],{"class":1085},[1050,2211,2213],{"class":1052,"line":2212},78,[1050,2214,1352],{"class":1067},[1050,2216,2218,2220,2222,2225,2228],{"class":1052,"line":2217},79,[1050,2219,1398],{"class":1063},[1050,2221,2183],{"class":1067},[1050,2223,2224],{"class":1411},">",[1050,2226,2227],{"class":1181}," 120",[1050,2229,1418],{"class":1085},[1050,2231,2233,2235,2237,2239,2241,2244,2246],{"class":1052,"line":2232},80,[1050,2234,1424],{"class":1063},[1050,2236,1427],{"class":1169},[1050,2238,1120],{"class":1085},[1050,2240,1337],{"class":1336},[1050,2242,2243],{"class":1340},"Please enter a realistic age.",[1050,2245,1337],{"class":1336},[1050,2247,1185],{"class":1085},[1050,2249,2251],{"class":1052,"line":2250},81,[1050,2252,1352],{"class":1067},[1050,2254,2256,2258],{"class":1052,"line":2255},82,[1050,2257,1588],{"class":1063},[1050,2259,2260],{"class":1067}," age\n",[1050,2262,2264],{"class":1052,"line":2263},83,[1050,2265,1152],{"class":1067},[1050,2267,2269,2271,2274,2276,2278],{"class":1052,"line":2268},84,[1050,2270,1290],{"class":1112},[1050,2272,2273],{"class":1293}," clean",[1050,2275,1120],{"class":1085},[1050,2277,1300],{"class":1299},[1050,2279,1132],{"class":1085},[1050,2281,2283,2285,2288],{"class":1052,"line":2282},85,[1050,2284,1308],{"class":1138},[1050,2286,2287],{"class":1142},"Step 2: Form-level validation",[1050,2289,1146],{"class":1138},[1050,2291,2293,2296,2298,2302,2305,2308],{"class":1052,"line":2292},86,[1050,2294,2295],{"class":1067},"        cleaned_data ",[1050,2297,1161],{"class":1085},[1050,2299,2301],{"class":2300},"sa2tF"," super",[1050,2303,2304],{"class":1085},"().",[1050,2306,2307],{"class":1169},"clean",[1050,2309,1203],{"class":1085},[1050,2311,2313],{"class":1052,"line":2312},87,[1050,2314,1352],{"class":1067},[1050,2316,2318,2320,2322,2324,2327,2329],{"class":1052,"line":2317},88,[1050,2319,1359],{"class":1358},[1050,2321,1120],{"class":1085},[1050,2323,1379],{"class":1336},[1050,2325,2326],{"class":1340},"2. Form-level validation",[1050,2328,1379],{"class":1336},[1050,2330,1185],{"class":1085},[1050,2332,2334],{"class":1052,"line":2333},89,[1050,2335,1352],{"class":1067},[1050,2337,2339,2341,2343,2346,2348,2351,2353,2355,2357,2359],{"class":1052,"line":2338},90,[1050,2340,1849],{"class":1067},[1050,2342,1161],{"class":1085},[1050,2344,2345],{"class":1067}," cleaned_data",[1050,2347,1086],{"class":1085},[1050,2349,2350],{"class":1169},"get",[1050,2352,1120],{"class":1085},[1050,2354,1337],{"class":1336},[1050,2356,1864],{"class":1340},[1050,2358,1337],{"class":1336},[1050,2360,1185],{"class":1085},[1050,2362,2364,2367,2369,2371,2373,2375,2377,2379,2382,2384],{"class":1052,"line":2363},91,[1050,2365,2366],{"class":1067},"        confirm_password ",[1050,2368,1161],{"class":1085},[1050,2370,2345],{"class":1067},[1050,2372,1086],{"class":1085},[1050,2374,2350],{"class":1169},[1050,2376,1120],{"class":1085},[1050,2378,1337],{"class":1336},[1050,2380,2381],{"class":1340},"confirm_password",[1050,2383,1337],{"class":1336},[1050,2385,1185],{"class":1085},[1050,2387,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407],{"class":1052,"line":2388},92,[1050,2390,1319],{"class":1067},[1050,2392,1161],{"class":1085},[1050,2394,2345],{"class":1067},[1050,2396,1086],{"class":1085},[1050,2398,2350],{"class":1169},[1050,2400,1120],{"class":1085},[1050,2402,1337],{"class":1336},[1050,2404,1341],{"class":1340},[1050,2406,1337],{"class":1336},[1050,2408,1185],{"class":1085},[1050,2410,2412],{"class":1052,"line":2411},93,[1050,2413,1352],{"class":1067},[1050,2415,2417],{"class":1052,"line":2416},94,[1050,2418,2419],{"class":1056},"        # Password confirmation\n",[1050,2421,2423,2425,2428,2431,2434],{"class":1052,"line":2422},95,[1050,2424,1398],{"class":1063},[1050,2426,2427],{"class":1067}," password ",[1050,2429,2430],{"class":1411},"and",[1050,2432,2433],{"class":1067}," confirm_password",[1050,2435,1418],{"class":1085},[1050,2437,2439,2442,2444,2447,2449],{"class":1052,"line":2438},96,[1050,2440,2441],{"class":1063},"            if",[1050,2443,2427],{"class":1067},[1050,2445,2446],{"class":1411},"!=",[1050,2448,2433],{"class":1067},[1050,2450,1418],{"class":1085},[1050,2452,2454,2457,2459,2461,2463,2466,2468],{"class":1052,"line":2453},97,[1050,2455,2456],{"class":1063},"                raise",[1050,2458,1427],{"class":1169},[1050,2460,1120],{"class":1085},[1050,2462,1337],{"class":1336},[1050,2464,2465],{"class":1340},"Passwords do not match.",[1050,2467,1337],{"class":1336},[1050,2469,1185],{"class":1085},[1050,2471,2473],{"class":1052,"line":2472},98,[1050,2474,1352],{"class":1067},[1050,2476,2478],{"class":1052,"line":2477},99,[1050,2479,2480],{"class":1056},"        # Username-password similarity\n",[1050,2482,2484,2486,2489,2491,2493],{"class":1052,"line":2483},100,[1050,2485,1398],{"class":1063},[1050,2487,2488],{"class":1067}," username ",[1050,2490,2430],{"class":1411},[1050,2492,1955],{"class":1067},[1050,2494,1418],{"class":1085},[1050,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514,2516],{"class":1052,"line":2497},101,[1050,2499,2441],{"class":1063},[1050,2501,1460],{"class":1067},[1050,2503,1086],{"class":1085},[1050,2505,2048],{"class":1169},[1050,2507,2051],{"class":1085},[1050,2509,1770],{"class":1411},[1050,2511,1955],{"class":1067},[1050,2513,1086],{"class":1085},[1050,2515,2048],{"class":1169},[1050,2517,1468],{"class":1085},[1050,2519,2521,2523,2525,2527,2529,2532,2534],{"class":1052,"line":2520},102,[1050,2522,2456],{"class":1063},[1050,2524,1427],{"class":1169},[1050,2526,1120],{"class":1085},[1050,2528,1337],{"class":1336},[1050,2530,2531],{"class":1340},"Password cannot contain the username.",[1050,2533,1337],{"class":1336},[1050,2535,1185],{"class":1085},[1050,2537,2539],{"class":1052,"line":2538},103,[1050,2540,1352],{"class":1067},[1050,2542,2544,2546],{"class":1052,"line":2543},104,[1050,2545,1588],{"class":1063},[1050,2547,2548],{"class":1067}," cleaned_data\n",[1050,2550,2552],{"class":1052,"line":2551},105,[1050,2553,1152],{"class":1067},[1050,2555,2557,2559,2562,2564,2566],{"class":1052,"line":2556},106,[1050,2558,1290],{"class":1112},[1050,2560,2561],{"class":1293}," full_clean",[1050,2563,1120],{"class":1085},[1050,2565,1300],{"class":1299},[1050,2567,1132],{"class":1085},[1050,2569,2571,2573,2576],{"class":1052,"line":2570},107,[1050,2572,1308],{"class":1138},[1050,2574,2575],{"class":1142},"Step 3: Complete form validation (rarely overridden)",[1050,2577,1146],{"class":1138},[1050,2579,2581,2583,2585,2587,2590,2592],{"class":1052,"line":2580},108,[1050,2582,1359],{"class":1358},[1050,2584,1120],{"class":1085},[1050,2586,1379],{"class":1336},[1050,2588,2589],{"class":1340},"3. Full form validation",[1050,2591,1379],{"class":1336},[1050,2593,1185],{"class":1085},[1050,2595,2597,2600,2602,2605],{"class":1052,"line":2596},109,[1050,2598,2599],{"class":2300},"        super",[1050,2601,2304],{"class":1085},[1050,2603,2604],{"class":1169},"full_clean",[1050,2606,1203],{"class":1085},[1050,2608,2610],{"class":1052,"line":2609},110,[1050,2611,1352],{"class":1067},[1050,2613,2615],{"class":1052,"line":2614},111,[1050,2616,2617],{"class":1056},"        # Additional business logic validation\n",[1050,2619,2621,2624,2626,2629],{"class":1052,"line":2620},112,[1050,2622,2623],{"class":1324},"        self",[1050,2625,1086],{"class":1085},[1050,2627,2628],{"class":1169},"_validate_business_rules",[1050,2630,1203],{"class":1085},[1050,2632,2634],{"class":1052,"line":2633},113,[1050,2635,1152],{"class":1067},[1050,2637,2639,2641,2644,2646,2648],{"class":1052,"line":2638},114,[1050,2640,1290],{"class":1112},[1050,2642,2643],{"class":1293}," _validate_business_rules",[1050,2645,1120],{"class":1085},[1050,2647,1300],{"class":1299},[1050,2649,1132],{"class":1085},[1050,2651,2653,2655,2658],{"class":1052,"line":2652},115,[1050,2654,1308],{"class":1138},[1050,2656,2657],{"class":1142},"Custom business rule validation",[1050,2659,1146],{"class":1138},[1050,2661,2663,2665,2667,2669,2672,2674],{"class":1052,"line":2662},116,[1050,2664,1359],{"class":1358},[1050,2666,1120],{"class":1085},[1050,2668,1379],{"class":1336},[1050,2670,2671],{"class":1340},"4. Business rules validation",[1050,2673,1379],{"class":1336},[1050,2675,1185],{"class":1085},[1050,2677,2679],{"class":1052,"line":2678},117,[1050,2680,1352],{"class":1067},[1050,2682,2684,2686,2689,2691,2693,2695,2697,2699,2701],{"class":1052,"line":2683},118,[1050,2685,1398],{"class":1063},[1050,2687,2688],{"class":1358}," hasattr",[1050,2690,1120],{"class":1085},[1050,2692,1300],{"class":1324},[1050,2694,1704],{"class":1085},[1050,2696,1707],{"class":1336},[1050,2698,1330],{"class":1340},[1050,2700,1337],{"class":1336},[1050,2702,1132],{"class":1085},[1050,2704,2706,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729],{"class":1052,"line":2705},119,[1050,2707,2708],{"class":1067},"            username ",[1050,2710,1161],{"class":1085},[1050,2712,1325],{"class":1324},[1050,2714,1086],{"class":1085},[1050,2716,1330],{"class":1231},[1050,2718,1086],{"class":1085},[1050,2720,2350],{"class":1169},[1050,2722,1120],{"class":1085},[1050,2724,1337],{"class":1336},[1050,2726,1341],{"class":1340},[1050,2728,1337],{"class":1336},[1050,2730,1185],{"class":1085},[1050,2732,2734,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757],{"class":1052,"line":2733},120,[1050,2735,2736],{"class":1067},"            email ",[1050,2738,1161],{"class":1085},[1050,2740,1325],{"class":1324},[1050,2742,1086],{"class":1085},[1050,2744,1330],{"class":1231},[1050,2746,1086],{"class":1085},[1050,2748,2350],{"class":1169},[1050,2750,1120],{"class":1085},[1050,2752,1337],{"class":1336},[1050,2754,1641],{"class":1340},[1050,2756,1337],{"class":1336},[1050,2758,1185],{"class":1085},[1050,2760,2762],{"class":1052,"line":2761},121,[1050,2763,2764],{"class":1067},"            \n",[1050,2766,2768],{"class":1052,"line":2767},122,[1050,2769,2770],{"class":1056},"            # Business rule: username cannot be part of email\n",[1050,2772,2774,2776,2778,2780,2783,2785,2787,2790,2792],{"class":1052,"line":2773},123,[1050,2775,2441],{"class":1063},[1050,2777,2488],{"class":1067},[1050,2779,2430],{"class":1411},[1050,2781,2782],{"class":1067}," email ",[1050,2784,2430],{"class":1411},[1050,2786,2488],{"class":1067},[1050,2788,2789],{"class":1411},"in",[1050,2791,1734],{"class":1067},[1050,2793,1418],{"class":1085},[1050,2795,2797,2800,2802,2805,2807,2811,2813,2815,2818,2820],{"class":1052,"line":2796},124,[1050,2798,2799],{"class":1324},"                self",[1050,2801,1086],{"class":1085},[1050,2803,2804],{"class":1169},"add_error",[1050,2806,1120],{"class":1085},[1050,2808,2810],{"class":2809},"s8XtY","None",[1050,2812,1704],{"class":1085},[1050,2814,1707],{"class":1336},[1050,2816,2817],{"class":1340},"Username cannot be part of email address.",[1050,2819,1337],{"class":1336},[1050,2821,1185],{"class":1085},[1030,2823,2825],{"id":2824},"field-level-validation","Field-Level Validation",[1035,2827,2829],{"id":2828},"built-in-validators","Built-in Validators",[1040,2831,2833],{"className":1042,"code":2832,"language":1044,"meta":1045,"style":1045},"# forms.py - Using built-in validators\nfrom django import forms\nfrom django.core.validators import (\n    RegexValidator, EmailValidator, URLValidator,\n    MinLengthValidator, MaxLengthValidator,\n    MinValueValidator, MaxValueValidator,\n    DecimalValidator, validate_email\n)\n\nclass ValidatorExamplesForm(forms.Form):\n    \"\"\"Examples of built-in validators\"\"\"\n    \n    # Regex validation\n    phone = forms.CharField(\n        max_length=15,\n        validators=[\n            RegexValidator(\n                regex=r'^\\+?1?\\d{9,15}$',\n                message='Phone number must be in format: \"+999999999\". Up to 15 digits allowed.'\n            )\n        ]\n    )\n    \n    # Multiple validators on one field\n    username = forms.CharField(\n        validators=[\n            MinLengthValidator(3, message='Username must be at least 3 characters.'),\n            MaxLengthValidator(20, message='Username cannot exceed 20 characters.'),\n            RegexValidator(\n                regex=r'^[a-zA-Z0-9_]+$',\n                message='Username can only contain letters, numbers, and underscores.'\n            )\n        ]\n    )\n    \n    # Numeric validators\n    age = forms.IntegerField(\n        validators=[\n            MinValueValidator(13, message='You must be at least 13 years old.'),\n            MaxValueValidator(120, message='Please enter a realistic age.')\n        ]\n    )\n    \n    # Decimal validation\n    price = forms.DecimalField(\n        max_digits=10,\n        decimal_places=2,\n        validators=[\n            MinValueValidator(0.01, message='Price must be at least $0.01.'),\n            MaxValueValidator(999999.99, message='Price cannot exceed $999,999.99.')\n        ]\n    )\n    \n    # URL validation with custom message\n    website = forms.URLField(\n        required=False,\n        validators=[\n            URLValidator(\n                message='Please enter a valid URL starting with http:// or https://'\n            )\n        ]\n    )\n    \n    # Email validation\n    email = forms.CharField(  # Using CharField instead of EmailField for custom validation\n        validators=[\n            EmailValidator(message='Please enter a valid email address.')\n        ]\n    )\n",[1047,2834,2835,2840,2850,2870,2888,2900,2912,2922,2926,2930,2947,2956,2960,2965,2981,2993,3001,3008,3050,3065,3070,3075,3080,3084,3089,3103,3109,3136,3161,3167,3198,3211,3215,3219,3223,3227,3232,3246,3252,3276,3300,3304,3308,3312,3317,3333,3345,3357,3363,3387,3411,3415,3419,3423,3428,3444,3456,3462,3469,3482,3486,3490,3494,3498,3503,3520,3526,3547,3551],{"__ignoreMap":1045},[1050,2836,2837],{"class":1052,"line":1053},[1050,2838,2839],{"class":1056},"# forms.py - Using built-in validators\n",[1050,2841,2842,2844,2846,2848],{"class":1052,"line":1060},[1050,2843,1064],{"class":1063},[1050,2845,1068],{"class":1067},[1050,2847,1071],{"class":1063},[1050,2849,1074],{"class":1067},[1050,2851,2852,2854,2856,2858,2860,2862,2865,2867],{"class":1052,"line":1077},[1050,2853,1064],{"class":1063},[1050,2855,1082],{"class":1067},[1050,2857,1086],{"class":1085},[1050,2859,1089],{"class":1067},[1050,2861,1086],{"class":1085},[1050,2863,2864],{"class":1067},"validators ",[1050,2866,1071],{"class":1063},[1050,2868,2869],{"class":1085}," (\n",[1050,2871,2872,2875,2877,2880,2882,2885],{"class":1052,"line":1102},[1050,2873,2874],{"class":1067},"    RegexValidator",[1050,2876,1704],{"class":1085},[1050,2878,2879],{"class":1067}," EmailValidator",[1050,2881,1704],{"class":1085},[1050,2883,2884],{"class":1067}," URLValidator",[1050,2886,2887],{"class":1085},",\n",[1050,2889,2890,2893,2895,2898],{"class":1052,"line":1109},[1050,2891,2892],{"class":1067},"    MinLengthValidator",[1050,2894,1704],{"class":1085},[1050,2896,2897],{"class":1067}," MaxLengthValidator",[1050,2899,2887],{"class":1085},[1050,2901,2902,2905,2907,2910],{"class":1052,"line":1135},[1050,2903,2904],{"class":1067},"    MinValueValidator",[1050,2906,1704],{"class":1085},[1050,2908,2909],{"class":1067}," MaxValueValidator",[1050,2911,2887],{"class":1085},[1050,2913,2914,2917,2919],{"class":1052,"line":1149},[1050,2915,2916],{"class":1067},"    DecimalValidator",[1050,2918,1704],{"class":1085},[1050,2920,2921],{"class":1067}," validate_email\n",[1050,2923,2924],{"class":1052,"line":1155},[1050,2925,1185],{"class":1085},[1050,2927,2928],{"class":1052,"line":1188},[1050,2929,1106],{"emptyLinePlaceholder":1105},[1050,2931,2932,2934,2937,2939,2941,2943,2945],{"class":1052,"line":1206},[1050,2933,1113],{"class":1112},[1050,2935,2936],{"class":1116}," ValidatorExamplesForm",[1050,2938,1120],{"class":1085},[1050,2940,1124],{"class":1123},[1050,2942,1086],{"class":1085},[1050,2944,1129],{"class":1123},[1050,2946,1132],{"class":1085},[1050,2948,2949,2951,2954],{"class":1052,"line":1237},[1050,2950,1139],{"class":1138},[1050,2952,2953],{"class":1142},"Examples of built-in validators",[1050,2955,1146],{"class":1138},[1050,2957,2958],{"class":1052,"line":1265},[1050,2959,1152],{"class":1067},[1050,2961,2962],{"class":1052,"line":1282},[1050,2963,2964],{"class":1056},"    # Regex validation\n",[1050,2966,2967,2970,2972,2974,2976,2978],{"class":1052,"line":1287},[1050,2968,2969],{"class":1067},"    phone ",[1050,2971,1161],{"class":1085},[1050,2973,1164],{"class":1067},[1050,2975,1086],{"class":1085},[1050,2977,1170],{"class":1169},[1050,2979,2980],{"class":1085},"(\n",[1050,2982,2983,2986,2988,2991],{"class":1052,"line":1305},[1050,2984,2985],{"class":1175},"        max_length",[1050,2987,1161],{"class":1085},[1050,2989,2990],{"class":1181},"15",[1050,2992,2887],{"class":1085},[1050,2994,2995,2998],{"class":1052,"line":1316},[1050,2996,2997],{"class":1175},"        validators",[1050,2999,3000],{"class":1085},"=[\n",[1050,3002,3003,3006],{"class":1052,"line":1349},[1050,3004,3005],{"class":1169},"            RegexValidator",[1050,3007,2980],{"class":1085},[1050,3009,3010,3013,3015,3018,3020,3024,3028,3032,3035,3037,3040,3043,3046,3048],{"class":1052,"line":1355},[1050,3011,3012],{"class":1175},"                regex",[1050,3014,1161],{"class":1085},[1050,3016,3017],{"class":1112},"r",[1050,3019,1337],{"class":1336},[1050,3021,3023],{"class":3022},"sRJPX","^",[1050,3025,3027],{"class":3026},"sk0MF","\\+",[1050,3029,3031],{"class":3030},"sGuSu","?",[1050,3033,1754],{"class":3034},"s27EL",[1050,3036,3031],{"class":3030},[1050,3038,3039],{"class":3022},"\\d",[1050,3041,3042],{"class":3030},"{9,15}",[1050,3044,3045],{"class":3022},"$",[1050,3047,1337],{"class":1336},[1050,3049,2887],{"class":1085},[1050,3051,3052,3055,3057,3059,3062],{"class":1052,"line":1384},[1050,3053,3054],{"class":1175},"                message",[1050,3056,1161],{"class":1085},[1050,3058,1337],{"class":1336},[1050,3060,3061],{"class":1340},"Phone number must be in format: \"+999999999\". Up to 15 digits allowed.",[1050,3063,3064],{"class":1336},"'\n",[1050,3066,3067],{"class":1052,"line":1389},[1050,3068,3069],{"class":1085},"            )\n",[1050,3071,3072],{"class":1052,"line":1395},[1050,3073,3074],{"class":1085},"        ]\n",[1050,3076,3077],{"class":1052,"line":1421},[1050,3078,3079],{"class":1085},"    )\n",[1050,3081,3082],{"class":1052,"line":1441},[1050,3083,1152],{"class":1067},[1050,3085,3086],{"class":1052,"line":1446},[1050,3087,3088],{"class":1056},"    # Multiple validators on one field\n",[1050,3090,3091,3093,3095,3097,3099,3101],{"class":1052,"line":1452},[1050,3092,1158],{"class":1067},[1050,3094,1161],{"class":1085},[1050,3096,1164],{"class":1067},[1050,3098,1086],{"class":1085},[1050,3100,1170],{"class":1169},[1050,3102,2980],{"class":1085},[1050,3104,3105,3107],{"class":1052,"line":1471},[1050,3106,2997],{"class":1175},[1050,3108,3000],{"class":1085},[1050,3110,3111,3114,3116,3119,3121,3124,3126,3128,3131,3133],{"class":1052,"line":1489},[1050,3112,3113],{"class":1169},"            MinLengthValidator",[1050,3115,1120],{"class":1085},[1050,3117,3118],{"class":1181},"3",[1050,3120,1704],{"class":1085},[1050,3122,3123],{"class":1175}," message",[1050,3125,1161],{"class":1085},[1050,3127,1337],{"class":1336},[1050,3129,3130],{"class":1340},"Username must be at least 3 characters.",[1050,3132,1337],{"class":1336},[1050,3134,3135],{"class":1085},"),\n",[1050,3137,3138,3141,3143,3146,3148,3150,3152,3154,3157,3159],{"class":1052,"line":1494},[1050,3139,3140],{"class":1169},"            MaxLengthValidator",[1050,3142,1120],{"class":1085},[1050,3144,3145],{"class":1181},"20",[1050,3147,1704],{"class":1085},[1050,3149,3123],{"class":1175},[1050,3151,1161],{"class":1085},[1050,3153,1337],{"class":1336},[1050,3155,3156],{"class":1340},"Username cannot exceed 20 characters.",[1050,3158,1337],{"class":1336},[1050,3160,3135],{"class":1085},[1050,3162,3163,3165],{"class":1052,"line":1500},[1050,3164,3005],{"class":1169},[1050,3166,2980],{"class":1085},[1050,3168,3169,3171,3173,3175,3177,3179,3182,3186,3189,3192,3194,3196],{"class":1052,"line":1528},[1050,3170,3012],{"class":1175},[1050,3172,1161],{"class":1085},[1050,3174,3017],{"class":1112},[1050,3176,1337],{"class":1336},[1050,3178,3023],{"class":3022},[1050,3180,1333],{"class":3181},"sETVe",[1050,3183,3185],{"class":3184},"sz9Cv","a-zA-Z0-9_",[1050,3187,3188],{"class":3181},"]",[1050,3190,3191],{"class":3030},"+",[1050,3193,3045],{"class":3022},[1050,3195,1337],{"class":1336},[1050,3197,2887],{"class":1085},[1050,3199,3200,3202,3204,3206,3209],{"class":1052,"line":1562},[1050,3201,3054],{"class":1175},[1050,3203,1161],{"class":1085},[1050,3205,1337],{"class":1336},[1050,3207,3208],{"class":1340},"Username can only contain letters, numbers, and underscores.",[1050,3210,3064],{"class":1336},[1050,3212,3213],{"class":1052,"line":1580},[1050,3214,3069],{"class":1085},[1050,3216,3217],{"class":1052,"line":1585},[1050,3218,3074],{"class":1085},[1050,3220,3221],{"class":1052,"line":1594},[1050,3222,3079],{"class":1085},[1050,3224,3225],{"class":1052,"line":1599},[1050,3226,1152],{"class":1067},[1050,3228,3229],{"class":1052,"line":1613},[1050,3230,3231],{"class":1056},"    # Numeric validators\n",[1050,3233,3234,3236,3238,3240,3242,3244],{"class":1052,"line":1623},[1050,3235,1268],{"class":1067},[1050,3237,1161],{"class":1085},[1050,3239,1164],{"class":1067},[1050,3241,1086],{"class":1085},[1050,3243,1277],{"class":1169},[1050,3245,2980],{"class":1085},[1050,3247,3248,3250],{"class":1052,"line":1648},[1050,3249,2997],{"class":1175},[1050,3251,3000],{"class":1085},[1050,3253,3254,3257,3259,3262,3264,3266,3268,3270,3272,3274],{"class":1052,"line":1653},[1050,3255,3256],{"class":1169},"            MinValueValidator",[1050,3258,1120],{"class":1085},[1050,3260,3261],{"class":1181},"13",[1050,3263,1704],{"class":1085},[1050,3265,3123],{"class":1175},[1050,3267,1161],{"class":1085},[1050,3269,1337],{"class":1336},[1050,3271,2205],{"class":1340},[1050,3273,1337],{"class":1336},[1050,3275,3135],{"class":1085},[1050,3277,3278,3281,3283,3286,3288,3290,3292,3294,3296,3298],{"class":1052,"line":1675},[1050,3279,3280],{"class":1169},"            MaxValueValidator",[1050,3282,1120],{"class":1085},[1050,3284,3285],{"class":1181},"120",[1050,3287,1704],{"class":1085},[1050,3289,3123],{"class":1175},[1050,3291,1161],{"class":1085},[1050,3293,1337],{"class":1336},[1050,3295,2243],{"class":1340},[1050,3297,1337],{"class":1336},[1050,3299,1185],{"class":1085},[1050,3301,3302],{"class":1052,"line":1680},[1050,3303,3074],{"class":1085},[1050,3305,3306],{"class":1052,"line":1686},[1050,3307,3079],{"class":1085},[1050,3309,3310],{"class":1052,"line":1726},[1050,3311,1152],{"class":1067},[1050,3313,3314],{"class":1052,"line":1759},[1050,3315,3316],{"class":1056},"    # Decimal validation\n",[1050,3318,3319,3322,3324,3326,3328,3331],{"class":1052,"line":1778},[1050,3320,3321],{"class":1067},"    price ",[1050,3323,1161],{"class":1085},[1050,3325,1164],{"class":1067},[1050,3327,1086],{"class":1085},[1050,3329,3330],{"class":1169},"DecimalField",[1050,3332,2980],{"class":1085},[1050,3334,3335,3338,3340,3343],{"class":1052,"line":1804},[1050,3336,3337],{"class":1175},"        max_digits",[1050,3339,1161],{"class":1085},[1050,3341,3342],{"class":1181},"10",[1050,3344,2887],{"class":1085},[1050,3346,3347,3350,3352,3355],{"class":1052,"line":1809},[1050,3348,3349],{"class":1175},"        decimal_places",[1050,3351,1161],{"class":1085},[1050,3353,3354],{"class":1181},"2",[1050,3356,2887],{"class":1085},[1050,3358,3359,3361],{"class":1052,"line":1817},[1050,3360,2997],{"class":1175},[1050,3362,3000],{"class":1085},[1050,3364,3365,3367,3369,3372,3374,3376,3378,3380,3383,3385],{"class":1052,"line":1822},[1050,3366,3256],{"class":1169},[1050,3368,1120],{"class":1085},[1050,3370,3371],{"class":1181},"0.01",[1050,3373,1704],{"class":1085},[1050,3375,3123],{"class":1175},[1050,3377,1161],{"class":1085},[1050,3379,1337],{"class":1336},[1050,3381,3382],{"class":1340},"Price must be at least $0.01.",[1050,3384,1337],{"class":1336},[1050,3386,3135],{"class":1085},[1050,3388,3389,3391,3393,3396,3398,3400,3402,3404,3407,3409],{"class":1052,"line":1836},[1050,3390,3280],{"class":1169},[1050,3392,1120],{"class":1085},[1050,3394,3395],{"class":1181},"999999.99",[1050,3397,1704],{"class":1085},[1050,3399,3123],{"class":1175},[1050,3401,1161],{"class":1085},[1050,3403,1337],{"class":1336},[1050,3405,3406],{"class":1340},"Price cannot exceed $999,999.99.",[1050,3408,1337],{"class":1336},[1050,3410,1185],{"class":1085},[1050,3412,3413],{"class":1052,"line":1846},[1050,3414,3074],{"class":1085},[1050,3416,3417],{"class":1052,"line":1871},[1050,3418,3079],{"class":1085},[1050,3420,3421],{"class":1052,"line":1876},[1050,3422,1152],{"class":1067},[1050,3424,3425],{"class":1052,"line":1890},[1050,3426,3427],{"class":1056},"    # URL validation with custom message\n",[1050,3429,3430,3433,3435,3437,3439,3442],{"class":1052,"line":1895},[1050,3431,3432],{"class":1067},"    website ",[1050,3434,1161],{"class":1085},[1050,3436,1164],{"class":1067},[1050,3438,1086],{"class":1085},[1050,3440,3441],{"class":1169},"URLField",[1050,3443,2980],{"class":1085},[1050,3445,3446,3449,3451,3454],{"class":1052,"line":1901},[1050,3447,3448],{"class":1175},"        required",[1050,3450,1161],{"class":1085},[1050,3452,3453],{"class":2809},"False",[1050,3455,2887],{"class":1085},[1050,3457,3458,3460],{"class":1052,"line":1921},[1050,3459,2997],{"class":1175},[1050,3461,3000],{"class":1085},[1050,3463,3464,3467],{"class":1052,"line":1939},[1050,3465,3466],{"class":1169},"            URLValidator",[1050,3468,2980],{"class":1085},[1050,3470,3471,3473,3475,3477,3480],{"class":1052,"line":1944},[1050,3472,3054],{"class":1175},[1050,3474,1161],{"class":1085},[1050,3476,1337],{"class":1336},[1050,3478,3479],{"class":1340},"Please enter a valid URL starting with http:// or https://",[1050,3481,3064],{"class":1336},[1050,3483,3484],{"class":1052,"line":1950},[1050,3485,3069],{"class":1085},[1050,3487,3488],{"class":1052,"line":1965},[1050,3489,3074],{"class":1085},[1050,3491,3492],{"class":1052,"line":1983},[1050,3493,3079],{"class":1085},[1050,3495,3496],{"class":1052,"line":1988},[1050,3497,1152],{"class":1067},[1050,3499,3500],{"class":1052,"line":1994},[1050,3501,3502],{"class":1056},"    # Email validation\n",[1050,3504,3505,3507,3509,3511,3513,3515,3517],{"class":1052,"line":2039},[1050,3506,1191],{"class":1067},[1050,3508,1161],{"class":1085},[1050,3510,1164],{"class":1067},[1050,3512,1086],{"class":1085},[1050,3514,1170],{"class":1169},[1050,3516,1120],{"class":1085},[1050,3518,3519],{"class":1056},"  # Using CharField instead of EmailField for custom validation\n",[1050,3521,3522,3524],{"class":1052,"line":2061},[1050,3523,2997],{"class":1175},[1050,3525,3000],{"class":1085},[1050,3527,3528,3531,3533,3536,3538,3540,3543,3545],{"class":1052,"line":2079},[1050,3529,3530],{"class":1169},"            EmailValidator",[1050,3532,1120],{"class":1085},[1050,3534,3535],{"class":1175},"message",[1050,3537,1161],{"class":1085},[1050,3539,1337],{"class":1336},[1050,3541,3542],{"class":1340},"Please enter a valid email address.",[1050,3544,1337],{"class":1336},[1050,3546,1185],{"class":1085},[1050,3548,3549],{"class":1052,"line":2084},[1050,3550,3074],{"class":1085},[1050,3552,3553],{"class":1052,"line":2092},[1050,3554,3079],{"class":1085},[1035,3556,3558],{"id":3557},"custom-validators","Custom Validators",[1040,3560,3562],{"className":1042,"code":3561,"language":1044,"meta":1045,"style":1045},"# validators.py - Custom validator functions\nfrom django.core.exceptions import ValidationError\nimport re\n\ndef validate_strong_password(password):\n    \"\"\"Validate password strength\"\"\"\n    if len(password) \u003C 8:\n        raise ValidationError('Password must be at least 8 characters long.')\n    \n    if not re.search(r'[A-Z]', password):\n        raise ValidationError('Password must contain at least one uppercase letter.')\n    \n    if not re.search(r'[a-z]', password):\n        raise ValidationError('Password must contain at least one lowercase letter.')\n    \n    if not re.search(r'\\d', password):\n        raise ValidationError('Password must contain at least one digit.')\n    \n    if not re.search(r'[!@#$%^&*(),.?\":{}|\u003C>]', password):\n        raise ValidationError('Password must contain at least one special character.')\n\ndef validate_file_size(file):\n    \"\"\"Validate uploaded file size\"\"\"\n    max_size = 5 * 1024 * 1024  # 5MB\n    if file.size > max_size:\n        raise ValidationError(f'File size cannot exceed 5MB. Current size: {file.size / (1024*1024):.1f}MB')\n\ndef validate_image_dimensions(image):\n    \"\"\"Validate image dimensions\"\"\"\n    max_width = 1920\n    max_height = 1080\n    \n    if image.width > max_width or image.height > max_height:\n        raise ValidationError(\n            f'Image dimensions cannot exceed {max_width}x{max_height}px. '\n            f'Current dimensions: {image.width}x{image.height}px'\n        )\n\ndef validate_profanity(text):\n    \"\"\"Basic profanity filter\"\"\"\n    profanity_words = ['badword1', 'badword2', 'badword3']  # Replace with actual list\n    text_lower = text.lower()\n    \n    for word in profanity_words:\n        if word in text_lower:\n            raise ValidationError('Content contains inappropriate language.')\n\ndef validate_business_hours(time_value):\n    \"\"\"Validate time is within business hours\"\"\"\n    from datetime import time\n    \n    business_start = time(9, 0)  # 9:00 AM\n    business_end = time(17, 0)   # 5:00 PM\n    \n    if not (business_start \u003C= time_value \u003C= business_end):\n        raise ValidationError('Time must be within business hours (9:00 AM - 5:00 PM).')\n\n# forms.py - Using custom validators\nclass AdvancedValidationForm(forms.Form):\n    \"\"\"Form using custom validators\"\"\"\n    \n    password = forms.CharField(\n        widget=forms.PasswordInput,\n        validators=[validate_strong_password]\n    )\n    \n    profile_image = forms.ImageField(\n        validators=[validate_file_size, validate_image_dimensions]\n    )\n    \n    bio = forms.CharField(\n        widget=forms.Textarea,\n        validators=[validate_profanity]\n    )\n    \n    appointment_time = forms.TimeField(\n        validators=[validate_business_hours]\n    )\n",[1047,3563,3564,3569,3587,3594,3598,3613,3622,3641,3658,3662,3697,3714,3718,3751,3768,3772,3800,3817,3821,3854,3871,3875,3889,3898,3921,3942,3989,3993,4007,4016,4026,4036,4040,4074,4082,4110,4142,4147,4151,4165,4174,4213,4229,4233,4248,4261,4278,4282,4296,4305,4318,4322,4347,4370,4374,4398,4415,4419,4424,4441,4450,4454,4468,4483,4495,4499,4503,4519,4534,4538,4542,4557,4572,4583,4587,4591,4607,4618],{"__ignoreMap":1045},[1050,3565,3566],{"class":1052,"line":1053},[1050,3567,3568],{"class":1056},"# validators.py - Custom validator functions\n",[1050,3570,3571,3573,3575,3577,3579,3581,3583,3585],{"class":1052,"line":1060},[1050,3572,1064],{"class":1063},[1050,3574,1082],{"class":1067},[1050,3576,1086],{"class":1085},[1050,3578,1089],{"class":1067},[1050,3580,1086],{"class":1085},[1050,3582,1094],{"class":1067},[1050,3584,1071],{"class":1063},[1050,3586,1099],{"class":1067},[1050,3588,3589,3591],{"class":1052,"line":1077},[1050,3590,1071],{"class":1063},[1050,3592,3593],{"class":1067}," re\n",[1050,3595,3596],{"class":1052,"line":1102},[1050,3597,1106],{"emptyLinePlaceholder":1105},[1050,3599,3600,3603,3606,3608,3611],{"class":1052,"line":1109},[1050,3601,3602],{"class":1112},"def",[1050,3604,3605],{"class":1293}," validate_strong_password",[1050,3607,1120],{"class":1085},[1050,3609,1864],{"class":3610},"sCyAa",[1050,3612,1132],{"class":1085},[1050,3614,3615,3617,3620],{"class":1052,"line":1135},[1050,3616,1139],{"class":1138},[1050,3618,3619],{"class":1142},"Validate password strength",[1050,3621,1146],{"class":1138},[1050,3623,3624,3627,3629,3631,3633,3635,3637,3639],{"class":1052,"line":1149},[1050,3625,3626],{"class":1063},"    if",[1050,3628,1401],{"class":1358},[1050,3630,1120],{"class":1085},[1050,3632,1864],{"class":1169},[1050,3634,1408],{"class":1085},[1050,3636,1412],{"class":1411},[1050,3638,1916],{"class":1181},[1050,3640,1418],{"class":1085},[1050,3642,3643,3646,3648,3650,3652,3654,3656],{"class":1052,"line":1155},[1050,3644,3645],{"class":1063},"        raise",[1050,3647,1427],{"class":1169},[1050,3649,1120],{"class":1085},[1050,3651,1337],{"class":1336},[1050,3653,1932],{"class":1340},[1050,3655,1337],{"class":1336},[1050,3657,1185],{"class":1085},[1050,3659,3660],{"class":1052,"line":1188},[1050,3661,1152],{"class":1067},[1050,3663,3664,3666,3668,3671,3673,3676,3678,3680,3682,3684,3687,3689,3691,3693,3695],{"class":1052,"line":1206},[1050,3665,3626],{"class":1063},[1050,3667,1457],{"class":1411},[1050,3669,3670],{"class":1067}," re",[1050,3672,1086],{"class":1085},[1050,3674,3675],{"class":1169},"search",[1050,3677,1120],{"class":1085},[1050,3679,3017],{"class":1112},[1050,3681,1337],{"class":1336},[1050,3683,1333],{"class":3181},[1050,3685,3686],{"class":3184},"A-Z",[1050,3688,3188],{"class":3181},[1050,3690,1337],{"class":1336},[1050,3692,1704],{"class":1085},[1050,3694,1955],{"class":1169},[1050,3696,1132],{"class":1085},[1050,3698,3699,3701,3703,3705,3707,3710,3712],{"class":1052,"line":1237},[1050,3700,3645],{"class":1063},[1050,3702,1427],{"class":1169},[1050,3704,1120],{"class":1085},[1050,3706,1337],{"class":1336},[1050,3708,3709],{"class":1340},"Password must contain at least one uppercase letter.",[1050,3711,1337],{"class":1336},[1050,3713,1185],{"class":1085},[1050,3715,3716],{"class":1052,"line":1265},[1050,3717,1152],{"class":1067},[1050,3719,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738,3741,3743,3745,3747,3749],{"class":1052,"line":1282},[1050,3721,3626],{"class":1063},[1050,3723,1457],{"class":1411},[1050,3725,3670],{"class":1067},[1050,3727,1086],{"class":1085},[1050,3729,3675],{"class":1169},[1050,3731,1120],{"class":1085},[1050,3733,3017],{"class":1112},[1050,3735,1337],{"class":1336},[1050,3737,1333],{"class":3181},[1050,3739,3740],{"class":3184},"a-z",[1050,3742,3188],{"class":3181},[1050,3744,1337],{"class":1336},[1050,3746,1704],{"class":1085},[1050,3748,1955],{"class":1169},[1050,3750,1132],{"class":1085},[1050,3752,3753,3755,3757,3759,3761,3764,3766],{"class":1052,"line":1287},[1050,3754,3645],{"class":1063},[1050,3756,1427],{"class":1169},[1050,3758,1120],{"class":1085},[1050,3760,1337],{"class":1336},[1050,3762,3763],{"class":1340},"Password must contain at least one lowercase letter.",[1050,3765,1337],{"class":1336},[1050,3767,1185],{"class":1085},[1050,3769,3770],{"class":1052,"line":1305},[1050,3771,1152],{"class":1067},[1050,3773,3774,3776,3778,3780,3782,3784,3786,3788,3790,3792,3794,3796,3798],{"class":1052,"line":1316},[1050,3775,3626],{"class":1063},[1050,3777,1457],{"class":1411},[1050,3779,3670],{"class":1067},[1050,3781,1086],{"class":1085},[1050,3783,3675],{"class":1169},[1050,3785,1120],{"class":1085},[1050,3787,3017],{"class":1112},[1050,3789,1337],{"class":1336},[1050,3791,3039],{"class":3022},[1050,3793,1337],{"class":1336},[1050,3795,1704],{"class":1085},[1050,3797,1955],{"class":1169},[1050,3799,1132],{"class":1085},[1050,3801,3802,3804,3806,3808,3810,3813,3815],{"class":1052,"line":1349},[1050,3803,3645],{"class":1063},[1050,3805,1427],{"class":1169},[1050,3807,1120],{"class":1085},[1050,3809,1337],{"class":1336},[1050,3811,3812],{"class":1340},"Password must contain at least one digit.",[1050,3814,1337],{"class":1336},[1050,3816,1185],{"class":1085},[1050,3818,3819],{"class":1052,"line":1355},[1050,3820,1152],{"class":1067},[1050,3822,3823,3825,3827,3829,3831,3833,3835,3837,3839,3841,3844,3846,3848,3850,3852],{"class":1052,"line":1384},[1050,3824,3626],{"class":1063},[1050,3826,1457],{"class":1411},[1050,3828,3670],{"class":1067},[1050,3830,1086],{"class":1085},[1050,3832,3675],{"class":1169},[1050,3834,1120],{"class":1085},[1050,3836,3017],{"class":1112},[1050,3838,1337],{"class":1336},[1050,3840,1333],{"class":3181},[1050,3842,3843],{"class":3184},"!@#$%^&*(),.?\":{}|\u003C>",[1050,3845,3188],{"class":3181},[1050,3847,1337],{"class":1336},[1050,3849,1704],{"class":1085},[1050,3851,1955],{"class":1169},[1050,3853,1132],{"class":1085},[1050,3855,3856,3858,3860,3862,3864,3867,3869],{"class":1052,"line":1389},[1050,3857,3645],{"class":1063},[1050,3859,1427],{"class":1169},[1050,3861,1120],{"class":1085},[1050,3863,1337],{"class":1336},[1050,3865,3866],{"class":1340},"Password must contain at least one special character.",[1050,3868,1337],{"class":1336},[1050,3870,1185],{"class":1085},[1050,3872,3873],{"class":1052,"line":1395},[1050,3874,1106],{"emptyLinePlaceholder":1105},[1050,3876,3877,3879,3882,3884,3887],{"class":1052,"line":1421},[1050,3878,3602],{"class":1112},[1050,3880,3881],{"class":1293}," validate_file_size",[1050,3883,1120],{"class":1085},[1050,3885,3886],{"class":3610},"file",[1050,3888,1132],{"class":1085},[1050,3890,3891,3893,3896],{"class":1052,"line":1441},[1050,3892,1139],{"class":1138},[1050,3894,3895],{"class":1142},"Validate uploaded file size",[1050,3897,1146],{"class":1138},[1050,3899,3900,3903,3905,3908,3911,3914,3916,3918],{"class":1052,"line":1446},[1050,3901,3902],{"class":1067},"    max_size ",[1050,3904,1161],{"class":1085},[1050,3906,3907],{"class":1181}," 5",[1050,3909,3910],{"class":1411}," *",[1050,3912,3913],{"class":1181}," 1024",[1050,3915,3910],{"class":1411},[1050,3917,3913],{"class":1181},[1050,3919,3920],{"class":1056},"  # 5MB\n",[1050,3922,3923,3925,3929,3931,3934,3937,3940],{"class":1052,"line":1452},[1050,3924,3626],{"class":1063},[1050,3926,3928],{"class":3927},"sSC40"," file",[1050,3930,1086],{"class":1085},[1050,3932,3933],{"class":1231},"size",[1050,3935,3936],{"class":1411}," >",[1050,3938,3939],{"class":1067}," max_size",[1050,3941,1418],{"class":1085},[1050,3943,3944,3946,3948,3950,3952,3955,3957,3959,3961,3963,3966,3969,3972,3975,3977,3979,3982,3984,3987],{"class":1052,"line":1471},[1050,3945,3645],{"class":1063},[1050,3947,1427],{"class":1169},[1050,3949,1120],{"class":1085},[1050,3951,1364],{"class":1112},[1050,3953,3954],{"class":1340},"'File size cannot exceed 5MB. Current size: ",[1050,3956,1371],{"class":1370},[1050,3958,3886],{"class":3927},[1050,3960,1086],{"class":1085},[1050,3962,3933],{"class":1231},[1050,3964,3965],{"class":1411}," /",[1050,3967,3968],{"class":1085}," (",[1050,3970,3971],{"class":1181},"1024",[1050,3973,3974],{"class":1411},"*",[1050,3976,3971],{"class":1181},[1050,3978,1408],{"class":1085},[1050,3980,3981],{"class":1112},":.1f",[1050,3983,1376],{"class":1370},[1050,3985,3986],{"class":1340},"MB'",[1050,3988,1185],{"class":1085},[1050,3990,3991],{"class":1052,"line":1489},[1050,3992,1106],{"emptyLinePlaceholder":1105},[1050,3994,3995,3997,4000,4002,4005],{"class":1052,"line":1494},[1050,3996,3602],{"class":1112},[1050,3998,3999],{"class":1293}," validate_image_dimensions",[1050,4001,1120],{"class":1085},[1050,4003,4004],{"class":3610},"image",[1050,4006,1132],{"class":1085},[1050,4008,4009,4011,4014],{"class":1052,"line":1500},[1050,4010,1139],{"class":1138},[1050,4012,4013],{"class":1142},"Validate image dimensions",[1050,4015,1146],{"class":1138},[1050,4017,4018,4021,4023],{"class":1052,"line":1528},[1050,4019,4020],{"class":1067},"    max_width ",[1050,4022,1161],{"class":1085},[1050,4024,4025],{"class":1181}," 1920\n",[1050,4027,4028,4031,4033],{"class":1052,"line":1562},[1050,4029,4030],{"class":1067},"    max_height ",[1050,4032,1161],{"class":1085},[1050,4034,4035],{"class":1181}," 1080\n",[1050,4037,4038],{"class":1052,"line":1580},[1050,4039,1152],{"class":1067},[1050,4041,4042,4044,4047,4049,4052,4054,4057,4060,4062,4064,4067,4069,4072],{"class":1052,"line":1585},[1050,4043,3626],{"class":1063},[1050,4045,4046],{"class":1067}," image",[1050,4048,1086],{"class":1085},[1050,4050,4051],{"class":1231},"width",[1050,4053,3936],{"class":1411},[1050,4055,4056],{"class":1067}," max_width ",[1050,4058,4059],{"class":1411},"or",[1050,4061,4046],{"class":1067},[1050,4063,1086],{"class":1085},[1050,4065,4066],{"class":1231},"height",[1050,4068,3936],{"class":1411},[1050,4070,4071],{"class":1067}," max_height",[1050,4073,1418],{"class":1085},[1050,4075,4076,4078,4080],{"class":1052,"line":1594},[1050,4077,3645],{"class":1063},[1050,4079,1427],{"class":1169},[1050,4081,2980],{"class":1085},[1050,4083,4084,4087,4090,4092,4095,4097,4100,4102,4105,4107],{"class":1052,"line":1599},[1050,4085,4086],{"class":1112},"            f",[1050,4088,4089],{"class":1340},"'Image dimensions cannot exceed ",[1050,4091,1371],{"class":1370},[1050,4093,4094],{"class":1169},"max_width",[1050,4096,1376],{"class":1370},[1050,4098,4099],{"class":1340},"x",[1050,4101,1371],{"class":1370},[1050,4103,4104],{"class":1169},"max_height",[1050,4106,1376],{"class":1370},[1050,4108,4109],{"class":1340},"px. '\n",[1050,4111,4112,4114,4117,4119,4121,4123,4125,4127,4129,4131,4133,4135,4137,4139],{"class":1052,"line":1613},[1050,4113,4086],{"class":1112},[1050,4115,4116],{"class":1340},"'Current dimensions: ",[1050,4118,1371],{"class":1370},[1050,4120,4004],{"class":1169},[1050,4122,1086],{"class":1085},[1050,4124,4051],{"class":1231},[1050,4126,1376],{"class":1370},[1050,4128,4099],{"class":1340},[1050,4130,1371],{"class":1370},[1050,4132,4004],{"class":1169},[1050,4134,1086],{"class":1085},[1050,4136,4066],{"class":1231},[1050,4138,1376],{"class":1370},[1050,4140,4141],{"class":1340},"px'\n",[1050,4143,4144],{"class":1052,"line":1623},[1050,4145,4146],{"class":1085},"        )\n",[1050,4148,4149],{"class":1052,"line":1648},[1050,4150,1106],{"emptyLinePlaceholder":1105},[1050,4152,4153,4155,4158,4160,4163],{"class":1052,"line":1653},[1050,4154,3602],{"class":1112},[1050,4156,4157],{"class":1293}," validate_profanity",[1050,4159,1120],{"class":1085},[1050,4161,4162],{"class":3610},"text",[1050,4164,1132],{"class":1085},[1050,4166,4167,4169,4172],{"class":1052,"line":1675},[1050,4168,1139],{"class":1138},[1050,4170,4171],{"class":1142},"Basic profanity filter",[1050,4173,1146],{"class":1138},[1050,4175,4176,4179,4181,4183,4185,4188,4190,4192,4194,4197,4199,4201,4203,4206,4208,4210],{"class":1052,"line":1680},[1050,4177,4178],{"class":1067},"    profanity_words ",[1050,4180,1161],{"class":1085},[1050,4182,1694],{"class":1085},[1050,4184,1337],{"class":1336},[1050,4186,4187],{"class":1340},"badword1",[1050,4189,1337],{"class":1336},[1050,4191,1704],{"class":1085},[1050,4193,1707],{"class":1336},[1050,4195,4196],{"class":1340},"badword2",[1050,4198,1337],{"class":1336},[1050,4200,1704],{"class":1085},[1050,4202,1707],{"class":1336},[1050,4204,4205],{"class":1340},"badword3",[1050,4207,1337],{"class":1336},[1050,4209,3188],{"class":1085},[1050,4211,4212],{"class":1056},"  # Replace with actual list\n",[1050,4214,4215,4218,4220,4223,4225,4227],{"class":1052,"line":1686},[1050,4216,4217],{"class":1067},"    text_lower ",[1050,4219,1161],{"class":1085},[1050,4221,4222],{"class":1067}," text",[1050,4224,1086],{"class":1085},[1050,4226,2048],{"class":1169},[1050,4228,1203],{"class":1085},[1050,4230,4231],{"class":1052,"line":1726},[1050,4232,1152],{"class":1067},[1050,4234,4235,4238,4241,4243,4246],{"class":1052,"line":1759},[1050,4236,4237],{"class":1063},"    for",[1050,4239,4240],{"class":1067}," word ",[1050,4242,2789],{"class":1063},[1050,4244,4245],{"class":1067}," profanity_words",[1050,4247,1418],{"class":1085},[1050,4249,4250,4252,4254,4256,4259],{"class":1052,"line":1778},[1050,4251,1398],{"class":1063},[1050,4253,4240],{"class":1067},[1050,4255,2789],{"class":1411},[1050,4257,4258],{"class":1067}," text_lower",[1050,4260,1418],{"class":1085},[1050,4262,4263,4265,4267,4269,4271,4274,4276],{"class":1052,"line":1804},[1050,4264,1424],{"class":1063},[1050,4266,1427],{"class":1169},[1050,4268,1120],{"class":1085},[1050,4270,1337],{"class":1336},[1050,4272,4273],{"class":1340},"Content contains inappropriate language.",[1050,4275,1337],{"class":1336},[1050,4277,1185],{"class":1085},[1050,4279,4280],{"class":1052,"line":1809},[1050,4281,1106],{"emptyLinePlaceholder":1105},[1050,4283,4284,4286,4289,4291,4294],{"class":1052,"line":1817},[1050,4285,3602],{"class":1112},[1050,4287,4288],{"class":1293}," validate_business_hours",[1050,4290,1120],{"class":1085},[1050,4292,4293],{"class":3610},"time_value",[1050,4295,1132],{"class":1085},[1050,4297,4298,4300,4303],{"class":1052,"line":1822},[1050,4299,1139],{"class":1138},[1050,4301,4302],{"class":1142},"Validate time is within business hours",[1050,4304,1146],{"class":1138},[1050,4306,4307,4310,4313,4315],{"class":1052,"line":1836},[1050,4308,4309],{"class":1063},"    from",[1050,4311,4312],{"class":1067}," datetime ",[1050,4314,1071],{"class":1063},[1050,4316,4317],{"class":1067}," time\n",[1050,4319,4320],{"class":1052,"line":1846},[1050,4321,1152],{"class":1067},[1050,4323,4324,4327,4329,4332,4334,4337,4339,4342,4344],{"class":1052,"line":1871},[1050,4325,4326],{"class":1067},"    business_start ",[1050,4328,1161],{"class":1085},[1050,4330,4331],{"class":1169}," time",[1050,4333,1120],{"class":1085},[1050,4335,4336],{"class":1181},"9",[1050,4338,1704],{"class":1085},[1050,4340,4341],{"class":1181}," 0",[1050,4343,1408],{"class":1085},[1050,4345,4346],{"class":1056},"  # 9:00 AM\n",[1050,4348,4349,4352,4354,4356,4358,4361,4363,4365,4367],{"class":1052,"line":1876},[1050,4350,4351],{"class":1067},"    business_end ",[1050,4353,1161],{"class":1085},[1050,4355,4331],{"class":1169},[1050,4357,1120],{"class":1085},[1050,4359,4360],{"class":1181},"17",[1050,4362,1704],{"class":1085},[1050,4364,4341],{"class":1181},[1050,4366,1408],{"class":1085},[1050,4368,4369],{"class":1056},"   # 5:00 PM\n",[1050,4371,4372],{"class":1052,"line":1890},[1050,4373,1152],{"class":1067},[1050,4375,4376,4378,4380,4382,4385,4388,4391,4393,4396],{"class":1052,"line":1895},[1050,4377,3626],{"class":1063},[1050,4379,1457],{"class":1411},[1050,4381,3968],{"class":1085},[1050,4383,4384],{"class":1067},"business_start ",[1050,4386,4387],{"class":1411},"\u003C=",[1050,4389,4390],{"class":1067}," time_value ",[1050,4392,4387],{"class":1411},[1050,4394,4395],{"class":1067}," business_end",[1050,4397,1132],{"class":1085},[1050,4399,4400,4402,4404,4406,4408,4411,4413],{"class":1052,"line":1901},[1050,4401,3645],{"class":1063},[1050,4403,1427],{"class":1169},[1050,4405,1120],{"class":1085},[1050,4407,1337],{"class":1336},[1050,4409,4410],{"class":1340},"Time must be within business hours (9:00 AM - 5:00 PM).",[1050,4412,1337],{"class":1336},[1050,4414,1185],{"class":1085},[1050,4416,4417],{"class":1052,"line":1921},[1050,4418,1106],{"emptyLinePlaceholder":1105},[1050,4420,4421],{"class":1052,"line":1939},[1050,4422,4423],{"class":1056},"# forms.py - Using custom validators\n",[1050,4425,4426,4428,4431,4433,4435,4437,4439],{"class":1052,"line":1944},[1050,4427,1113],{"class":1112},[1050,4429,4430],{"class":1116}," AdvancedValidationForm",[1050,4432,1120],{"class":1085},[1050,4434,1124],{"class":1123},[1050,4436,1086],{"class":1085},[1050,4438,1129],{"class":1123},[1050,4440,1132],{"class":1085},[1050,4442,4443,4445,4448],{"class":1052,"line":1950},[1050,4444,1139],{"class":1138},[1050,4446,4447],{"class":1142},"Form using custom validators",[1050,4449,1146],{"class":1138},[1050,4451,4452],{"class":1052,"line":1965},[1050,4453,1152],{"class":1067},[1050,4455,4456,4458,4460,4462,4464,4466],{"class":1052,"line":1983},[1050,4457,1209],{"class":1067},[1050,4459,1161],{"class":1085},[1050,4461,1164],{"class":1067},[1050,4463,1086],{"class":1085},[1050,4465,1170],{"class":1169},[1050,4467,2980],{"class":1085},[1050,4469,4470,4473,4475,4477,4479,4481],{"class":1052,"line":1988},[1050,4471,4472],{"class":1175},"        widget",[1050,4474,1161],{"class":1085},[1050,4476,1124],{"class":1169},[1050,4478,1086],{"class":1085},[1050,4480,1232],{"class":1231},[1050,4482,2887],{"class":1085},[1050,4484,4485,4487,4490,4493],{"class":1052,"line":1994},[1050,4486,2997],{"class":1175},[1050,4488,4489],{"class":1085},"=[",[1050,4491,4492],{"class":1169},"validate_strong_password",[1050,4494,1346],{"class":1085},[1050,4496,4497],{"class":1052,"line":2039},[1050,4498,3079],{"class":1085},[1050,4500,4501],{"class":1052,"line":2061},[1050,4502,1152],{"class":1067},[1050,4504,4505,4508,4510,4512,4514,4517],{"class":1052,"line":2079},[1050,4506,4507],{"class":1067},"    profile_image ",[1050,4509,1161],{"class":1085},[1050,4511,1164],{"class":1067},[1050,4513,1086],{"class":1085},[1050,4515,4516],{"class":1169},"ImageField",[1050,4518,2980],{"class":1085},[1050,4520,4521,4523,4525,4528,4530,4532],{"class":1052,"line":2084},[1050,4522,2997],{"class":1175},[1050,4524,4489],{"class":1085},[1050,4526,4527],{"class":1169},"validate_file_size",[1050,4529,1704],{"class":1085},[1050,4531,3999],{"class":1169},[1050,4533,1346],{"class":1085},[1050,4535,4536],{"class":1052,"line":2092},[1050,4537,3079],{"class":1085},[1050,4539,4540],{"class":1052,"line":2097},[1050,4541,1152],{"class":1067},[1050,4543,4544,4547,4549,4551,4553,4555],{"class":1052,"line":2111},[1050,4545,4546],{"class":1067},"    bio ",[1050,4548,1161],{"class":1085},[1050,4550,1164],{"class":1067},[1050,4552,1086],{"class":1085},[1050,4554,1170],{"class":1169},[1050,4556,2980],{"class":1085},[1050,4558,4559,4561,4563,4565,4567,4570],{"class":1052,"line":2121},[1050,4560,4472],{"class":1175},[1050,4562,1161],{"class":1085},[1050,4564,1124],{"class":1169},[1050,4566,1086],{"class":1085},[1050,4568,4569],{"class":1231},"Textarea",[1050,4571,2887],{"class":1085},[1050,4573,4574,4576,4578,4581],{"class":1052,"line":2146},[1050,4575,2997],{"class":1175},[1050,4577,4489],{"class":1085},[1050,4579,4580],{"class":1169},"validate_profanity",[1050,4582,1346],{"class":1085},[1050,4584,4585],{"class":1052,"line":2151},[1050,4586,3079],{"class":1085},[1050,4588,4589],{"class":1052,"line":2173},[1050,4590,1152],{"class":1067},[1050,4592,4593,4596,4598,4600,4602,4605],{"class":1052,"line":2178},[1050,4594,4595],{"class":1067},"    appointment_time ",[1050,4597,1161],{"class":1085},[1050,4599,1164],{"class":1067},[1050,4601,1086],{"class":1085},[1050,4603,4604],{"class":1169},"TimeField",[1050,4606,2980],{"class":1085},[1050,4608,4609,4611,4613,4616],{"class":1052,"line":2194},[1050,4610,2997],{"class":1175},[1050,4612,4489],{"class":1085},[1050,4614,4615],{"class":1169},"validate_business_hours",[1050,4617,1346],{"class":1085},[1050,4619,4620],{"class":1052,"line":2212},[1050,4621,3079],{"class":1085},[1030,4623,4625],{"id":4624},"form-level-validation","Form-Level Validation",[1035,4627,4629],{"id":4628},"cross-field-validation","Cross-Field Validation",[1040,4631,4633],{"className":1042,"code":4632,"language":1044,"meta":1045,"style":1045},"# forms.py - Complex form-level validation\nfrom django import forms\nfrom django.core.exceptions import ValidationError\nfrom datetime import date, datetime, timedelta\n\nclass EventBookingForm(forms.Form):\n    \"\"\"Event booking with complex validation rules\"\"\"\n    \n    event_name = forms.CharField(max_length=200)\n    start_date = forms.DateField()\n    end_date = forms.DateField()\n    start_time = forms.TimeField()\n    end_time = forms.TimeField()\n    attendees = forms.IntegerField(min_value=1)\n    budget = forms.DecimalField(max_digits=10, decimal_places=2)\n    \n    # Room selection\n    ROOM_CHOICES = [\n        ('small', 'Small Room (10 people) - $100/day'),\n        ('medium', 'Medium Room (25 people) - $200/day'),\n        ('large', 'Large Room (50 people) - $300/day'),\n        ('auditorium', 'Auditorium (100+ people) - $500/day'),\n    ]\n    \n    room_type = forms.ChoiceField(choices=ROOM_CHOICES)\n    \n    # Additional services\n    catering = forms.BooleanField(required=False, label='Catering Required')\n    av_equipment = forms.BooleanField(required=False, label='A/V Equipment')\n    parking = forms.BooleanField(required=False, label='Reserved Parking')\n    \n    def clean(self):\n        \"\"\"Comprehensive form-level validation\"\"\"\n        cleaned_data = super().clean()\n        \n        # Date validation\n        self._validate_dates(cleaned_data)\n        \n        # Time validation\n        self._validate_times(cleaned_data)\n        \n        # Capacity validation\n        self._validate_capacity(cleaned_data)\n        \n        # Budget validation\n        self._validate_budget(cleaned_data)\n        \n        # Availability validation\n        self._validate_availability(cleaned_data)\n        \n        return cleaned_data\n    \n    def _validate_dates(self, data):\n        \"\"\"Validate date range\"\"\"\n        start_date = data.get('start_date')\n        end_date = data.get('end_date')\n        \n        if start_date and end_date:\n            # End date must be after start date\n            if end_date \u003C start_date:\n                raise ValidationError('End date must be after start date.')\n            \n            # Cannot book in the past\n            if start_date \u003C date.today():\n                raise ValidationError('Cannot book events in the past.')\n            \n            # Maximum booking duration\n            if (end_date - start_date).days > 30:\n                raise ValidationError('Events cannot exceed 30 days.')\n            \n            # Minimum advance booking\n            if start_date \u003C date.today() + timedelta(days=2):\n                raise ValidationError('Events must be booked at least 2 days in advance.')\n    \n    def _validate_times(self, data):\n        \"\"\"Validate time range\"\"\"\n        start_time = data.get('start_time')\n        end_time = data.get('end_time')\n        start_date = data.get('start_date')\n        end_date = data.get('end_date')\n        \n        if start_time and end_time and start_date and end_date:\n            # For same-day events, end time must be after start time\n            if start_date == end_date and end_time \u003C= start_time:\n                raise ValidationError('End time must be after start time for same-day events.')\n            \n            # Business hours validation\n            from datetime import time\n            business_start = time(8, 0)\n            business_end = time(22, 0)\n            \n            if not (business_start \u003C= start_time \u003C= business_end):\n                raise ValidationError('Start time must be within business hours (8:00 AM - 10:00 PM).')\n            \n            if not (business_start \u003C= end_time \u003C= business_end):\n                raise ValidationError('End time must be within business hours (8:00 AM - 10:00 PM).')\n    \n    def _validate_capacity(self, data):\n        \"\"\"Validate room capacity vs attendees\"\"\"\n        room_type = data.get('room_type')\n        attendees = data.get('attendees')\n        \n        if room_type and attendees:\n            capacity_limits = {\n                'small': 10,\n                'medium': 25,\n                'large': 50,\n                'auditorium': 200\n            }\n            \n            max_capacity = capacity_limits.get(room_type, 0)\n            if attendees > max_capacity:\n                raise ValidationError(\n                    f'Selected room can accommodate maximum {max_capacity} people. '\n                    f'You have {attendees} attendees.'\n                )\n    \n    def _validate_budget(self, data):\n        \"\"\"Validate budget against estimated costs\"\"\"\n        room_type = data.get('room_type')\n        budget = data.get('budget')\n        start_date = data.get('start_date')\n        end_date = data.get('end_date')\n        catering = data.get('catering', False)\n        av_equipment = data.get('av_equipment', False)\n        parking = data.get('parking', False)\n        attendees = data.get('attendees', 0)\n        \n        if all([room_type, budget, start_date, end_date]):\n            # Calculate estimated cost\n            room_costs = {\n                'small': 100,\n                'medium': 200,\n                'large': 300,\n                'auditorium': 500\n            }\n            \n            days = (end_date - start_date).days + 1\n            room_cost = room_costs.get(room_type, 0) * days\n            \n            additional_costs = 0\n            if catering:\n                additional_costs += attendees * 25  # $25 per person\n            if av_equipment:\n                additional_costs += 150 * days\n            if parking:\n                additional_costs += 50 * days\n            \n            total_estimated_cost = room_cost + additional_costs\n            \n            if budget \u003C total_estimated_cost:\n                raise ValidationError(\n                    f'Budget (${budget}) is insufficient. '\n                    f'Estimated cost: ${total_estimated_cost} '\n                    f'(Room: ${room_cost}, Additional: ${additional_costs})'\n                )\n    \n    def _validate_availability(self, data):\n        \"\"\"Check room availability (simplified)\"\"\"\n        room_type = data.get('room_type')\n        start_date = data.get('start_date')\n        end_date = data.get('end_date')\n        \n        if all([room_type, start_date, end_date]):\n            # In a real application, check against booking database\n            # This is a simplified example\n            \n            # Simulate checking availability\n            from .models import Booking\n            \n            conflicting_bookings = Booking.objects.filter(\n                room_type=room_type,\n                start_date__lte=end_date,\n                end_date__gte=start_date\n            )\n            \n            if conflicting_bookings.exists():\n                raise ValidationError(\n                    f'Selected room is not available for the chosen dates. '\n                    f'Please select different dates or room type.'\n                )\n",[1047,4634,4635,4640,4650,4668,4689,4693,4710,4719,4723,4747,4763,4778,4793,4808,4832,4865,4869,4874,4885,4908,4930,4952,4974,4979,4983,5010,5014,5019,5058,5094,5130,5134,5146,5155,5169,5173,5178,5193,5197,5202,5217,5221,5226,5241,5245,5250,5265,5269,5274,5289,5293,5299,5303,5321,5330,5354,5378,5382,5396,5401,5415,5432,5436,5441,5458,5475,5479,5484,5510,5527,5531,5536,5568,5585,5589,5606,5615,5639,5663,5685,5707,5711,5733,5738,5760,5777,5781,5786,5797,5817,5837,5841,5861,5878,5882,5902,5919,5923,5940,5949,5973,5997,6001,6015,6025,6042,6057,6072,6085,6090,6094,6118,6132,6140,6158,6174,6179,6183,6200,6209,6231,6255,6277,6299,6328,6357,6386,6413,6418,6447,6453,6463,6479,6495,6511,6525,6530,6535,6560,6590,6595,6606,6616,6634,6644,6658,6668,6681,6686,6702,6707,6722,6731,6748,6766,6794,6799,6804,6822,6832,6855,6878,6901,6906,6927,6933,6939,6944,6950,6965,6970,6991,7003,7015,7026,7031,7036,7050,7059,7067,7075],{"__ignoreMap":1045},[1050,4636,4637],{"class":1052,"line":1053},[1050,4638,4639],{"class":1056},"# forms.py - Complex form-level validation\n",[1050,4641,4642,4644,4646,4648],{"class":1052,"line":1060},[1050,4643,1064],{"class":1063},[1050,4645,1068],{"class":1067},[1050,4647,1071],{"class":1063},[1050,4649,1074],{"class":1067},[1050,4651,4652,4654,4656,4658,4660,4662,4664,4666],{"class":1052,"line":1077},[1050,4653,1064],{"class":1063},[1050,4655,1082],{"class":1067},[1050,4657,1086],{"class":1085},[1050,4659,1089],{"class":1067},[1050,4661,1086],{"class":1085},[1050,4663,1094],{"class":1067},[1050,4665,1071],{"class":1063},[1050,4667,1099],{"class":1067},[1050,4669,4670,4672,4674,4676,4679,4681,4684,4686],{"class":1052,"line":1102},[1050,4671,1064],{"class":1063},[1050,4673,4312],{"class":1067},[1050,4675,1071],{"class":1063},[1050,4677,4678],{"class":1067}," date",[1050,4680,1704],{"class":1085},[1050,4682,4683],{"class":1067}," datetime",[1050,4685,1704],{"class":1085},[1050,4687,4688],{"class":1067}," timedelta\n",[1050,4690,4691],{"class":1052,"line":1109},[1050,4692,1106],{"emptyLinePlaceholder":1105},[1050,4694,4695,4697,4700,4702,4704,4706,4708],{"class":1052,"line":1135},[1050,4696,1113],{"class":1112},[1050,4698,4699],{"class":1116}," EventBookingForm",[1050,4701,1120],{"class":1085},[1050,4703,1124],{"class":1123},[1050,4705,1086],{"class":1085},[1050,4707,1129],{"class":1123},[1050,4709,1132],{"class":1085},[1050,4711,4712,4714,4717],{"class":1052,"line":1149},[1050,4713,1139],{"class":1138},[1050,4715,4716],{"class":1142},"Event booking with complex validation rules",[1050,4718,1146],{"class":1138},[1050,4720,4721],{"class":1052,"line":1155},[1050,4722,1152],{"class":1067},[1050,4724,4725,4728,4730,4732,4734,4736,4738,4740,4742,4745],{"class":1052,"line":1188},[1050,4726,4727],{"class":1067},"    event_name ",[1050,4729,1161],{"class":1085},[1050,4731,1164],{"class":1067},[1050,4733,1086],{"class":1085},[1050,4735,1170],{"class":1169},[1050,4737,1120],{"class":1085},[1050,4739,1176],{"class":1175},[1050,4741,1161],{"class":1085},[1050,4743,4744],{"class":1181},"200",[1050,4746,1185],{"class":1085},[1050,4748,4749,4752,4754,4756,4758,4761],{"class":1052,"line":1206},[1050,4750,4751],{"class":1067},"    start_date ",[1050,4753,1161],{"class":1085},[1050,4755,1164],{"class":1067},[1050,4757,1086],{"class":1085},[1050,4759,4760],{"class":1169},"DateField",[1050,4762,1203],{"class":1085},[1050,4764,4765,4768,4770,4772,4774,4776],{"class":1052,"line":1237},[1050,4766,4767],{"class":1067},"    end_date ",[1050,4769,1161],{"class":1085},[1050,4771,1164],{"class":1067},[1050,4773,1086],{"class":1085},[1050,4775,4760],{"class":1169},[1050,4777,1203],{"class":1085},[1050,4779,4780,4783,4785,4787,4789,4791],{"class":1052,"line":1265},[1050,4781,4782],{"class":1067},"    start_time ",[1050,4784,1161],{"class":1085},[1050,4786,1164],{"class":1067},[1050,4788,1086],{"class":1085},[1050,4790,4604],{"class":1169},[1050,4792,1203],{"class":1085},[1050,4794,4795,4798,4800,4802,4804,4806],{"class":1052,"line":1282},[1050,4796,4797],{"class":1067},"    end_time ",[1050,4799,1161],{"class":1085},[1050,4801,1164],{"class":1067},[1050,4803,1086],{"class":1085},[1050,4805,4604],{"class":1169},[1050,4807,1203],{"class":1085},[1050,4809,4810,4813,4815,4817,4819,4821,4823,4826,4828,4830],{"class":1052,"line":1287},[1050,4811,4812],{"class":1067},"    attendees ",[1050,4814,1161],{"class":1085},[1050,4816,1164],{"class":1067},[1050,4818,1086],{"class":1085},[1050,4820,1277],{"class":1169},[1050,4822,1120],{"class":1085},[1050,4824,4825],{"class":1175},"min_value",[1050,4827,1161],{"class":1085},[1050,4829,1754],{"class":1181},[1050,4831,1185],{"class":1085},[1050,4833,4834,4837,4839,4841,4843,4845,4847,4850,4852,4854,4856,4859,4861,4863],{"class":1052,"line":1305},[1050,4835,4836],{"class":1067},"    budget ",[1050,4838,1161],{"class":1085},[1050,4840,1164],{"class":1067},[1050,4842,1086],{"class":1085},[1050,4844,3330],{"class":1169},[1050,4846,1120],{"class":1085},[1050,4848,4849],{"class":1175},"max_digits",[1050,4851,1161],{"class":1085},[1050,4853,3342],{"class":1181},[1050,4855,1704],{"class":1085},[1050,4857,4858],{"class":1175}," decimal_places",[1050,4860,1161],{"class":1085},[1050,4862,3354],{"class":1181},[1050,4864,1185],{"class":1085},[1050,4866,4867],{"class":1052,"line":1316},[1050,4868,1152],{"class":1067},[1050,4870,4871],{"class":1052,"line":1349},[1050,4872,4873],{"class":1056},"    # Room selection\n",[1050,4875,4876,4879,4882],{"class":1052,"line":1355},[1050,4877,4878],{"class":1324},"    ROOM_CHOICES",[1050,4880,4881],{"class":1085}," =",[1050,4883,4884],{"class":1085}," [\n",[1050,4886,4887,4890,4892,4895,4897,4899,4901,4904,4906],{"class":1052,"line":1384},[1050,4888,4889],{"class":1085},"        (",[1050,4891,1337],{"class":1336},[1050,4893,4894],{"class":1340},"small",[1050,4896,1337],{"class":1336},[1050,4898,1704],{"class":1085},[1050,4900,1707],{"class":1336},[1050,4902,4903],{"class":1340},"Small Room (10 people) - $100/day",[1050,4905,1337],{"class":1336},[1050,4907,3135],{"class":1085},[1050,4909,4910,4912,4914,4917,4919,4921,4923,4926,4928],{"class":1052,"line":1389},[1050,4911,4889],{"class":1085},[1050,4913,1337],{"class":1336},[1050,4915,4916],{"class":1340},"medium",[1050,4918,1337],{"class":1336},[1050,4920,1704],{"class":1085},[1050,4922,1707],{"class":1336},[1050,4924,4925],{"class":1340},"Medium Room (25 people) - $200/day",[1050,4927,1337],{"class":1336},[1050,4929,3135],{"class":1085},[1050,4931,4932,4934,4936,4939,4941,4943,4945,4948,4950],{"class":1052,"line":1395},[1050,4933,4889],{"class":1085},[1050,4935,1337],{"class":1336},[1050,4937,4938],{"class":1340},"large",[1050,4940,1337],{"class":1336},[1050,4942,1704],{"class":1085},[1050,4944,1707],{"class":1336},[1050,4946,4947],{"class":1340},"Large Room (50 people) - $300/day",[1050,4949,1337],{"class":1336},[1050,4951,3135],{"class":1085},[1050,4953,4954,4956,4958,4961,4963,4965,4967,4970,4972],{"class":1052,"line":1421},[1050,4955,4889],{"class":1085},[1050,4957,1337],{"class":1336},[1050,4959,4960],{"class":1340},"auditorium",[1050,4962,1337],{"class":1336},[1050,4964,1704],{"class":1085},[1050,4966,1707],{"class":1336},[1050,4968,4969],{"class":1340},"Auditorium (100+ people) - $500/day",[1050,4971,1337],{"class":1336},[1050,4973,3135],{"class":1085},[1050,4975,4976],{"class":1052,"line":1441},[1050,4977,4978],{"class":1085},"    ]\n",[1050,4980,4981],{"class":1052,"line":1446},[1050,4982,1152],{"class":1067},[1050,4984,4985,4988,4990,4992,4994,4997,4999,5002,5004,5008],{"class":1052,"line":1452},[1050,4986,4987],{"class":1067},"    room_type ",[1050,4989,1161],{"class":1085},[1050,4991,1164],{"class":1067},[1050,4993,1086],{"class":1085},[1050,4995,4996],{"class":1169},"ChoiceField",[1050,4998,1120],{"class":1085},[1050,5000,5001],{"class":1175},"choices",[1050,5003,1161],{"class":1085},[1050,5005,5007],{"class":5006},"s6DHA","ROOM_CHOICES",[1050,5009,1185],{"class":1085},[1050,5011,5012],{"class":1052,"line":1471},[1050,5013,1152],{"class":1067},[1050,5015,5016],{"class":1052,"line":1489},[1050,5017,5018],{"class":1056},"    # Additional services\n",[1050,5020,5021,5024,5026,5028,5030,5033,5035,5038,5040,5042,5044,5047,5049,5051,5054,5056],{"class":1052,"line":1494},[1050,5022,5023],{"class":1067},"    catering ",[1050,5025,1161],{"class":1085},[1050,5027,1164],{"class":1067},[1050,5029,1086],{"class":1085},[1050,5031,5032],{"class":1169},"BooleanField",[1050,5034,1120],{"class":1085},[1050,5036,5037],{"class":1175},"required",[1050,5039,1161],{"class":1085},[1050,5041,3453],{"class":2809},[1050,5043,1704],{"class":1085},[1050,5045,5046],{"class":1175}," label",[1050,5048,1161],{"class":1085},[1050,5050,1337],{"class":1336},[1050,5052,5053],{"class":1340},"Catering Required",[1050,5055,1337],{"class":1336},[1050,5057,1185],{"class":1085},[1050,5059,5060,5063,5065,5067,5069,5071,5073,5075,5077,5079,5081,5083,5085,5087,5090,5092],{"class":1052,"line":1500},[1050,5061,5062],{"class":1067},"    av_equipment ",[1050,5064,1161],{"class":1085},[1050,5066,1164],{"class":1067},[1050,5068,1086],{"class":1085},[1050,5070,5032],{"class":1169},[1050,5072,1120],{"class":1085},[1050,5074,5037],{"class":1175},[1050,5076,1161],{"class":1085},[1050,5078,3453],{"class":2809},[1050,5080,1704],{"class":1085},[1050,5082,5046],{"class":1175},[1050,5084,1161],{"class":1085},[1050,5086,1337],{"class":1336},[1050,5088,5089],{"class":1340},"A/V Equipment",[1050,5091,1337],{"class":1336},[1050,5093,1185],{"class":1085},[1050,5095,5096,5099,5101,5103,5105,5107,5109,5111,5113,5115,5117,5119,5121,5123,5126,5128],{"class":1052,"line":1528},[1050,5097,5098],{"class":1067},"    parking ",[1050,5100,1161],{"class":1085},[1050,5102,1164],{"class":1067},[1050,5104,1086],{"class":1085},[1050,5106,5032],{"class":1169},[1050,5108,1120],{"class":1085},[1050,5110,5037],{"class":1175},[1050,5112,1161],{"class":1085},[1050,5114,3453],{"class":2809},[1050,5116,1704],{"class":1085},[1050,5118,5046],{"class":1175},[1050,5120,1161],{"class":1085},[1050,5122,1337],{"class":1336},[1050,5124,5125],{"class":1340},"Reserved Parking",[1050,5127,1337],{"class":1336},[1050,5129,1185],{"class":1085},[1050,5131,5132],{"class":1052,"line":1562},[1050,5133,1152],{"class":1067},[1050,5135,5136,5138,5140,5142,5144],{"class":1052,"line":1580},[1050,5137,1290],{"class":1112},[1050,5139,2273],{"class":1293},[1050,5141,1120],{"class":1085},[1050,5143,1300],{"class":1299},[1050,5145,1132],{"class":1085},[1050,5147,5148,5150,5153],{"class":1052,"line":1585},[1050,5149,1308],{"class":1138},[1050,5151,5152],{"class":1142},"Comprehensive form-level validation",[1050,5154,1146],{"class":1138},[1050,5156,5157,5159,5161,5163,5165,5167],{"class":1052,"line":1594},[1050,5158,2295],{"class":1067},[1050,5160,1161],{"class":1085},[1050,5162,2301],{"class":2300},[1050,5164,2304],{"class":1085},[1050,5166,2307],{"class":1169},[1050,5168,1203],{"class":1085},[1050,5170,5171],{"class":1052,"line":1599},[1050,5172,1352],{"class":1067},[1050,5174,5175],{"class":1052,"line":1613},[1050,5176,5177],{"class":1056},"        # Date validation\n",[1050,5179,5180,5182,5184,5187,5189,5191],{"class":1052,"line":1623},[1050,5181,2623],{"class":1324},[1050,5183,1086],{"class":1085},[1050,5185,5186],{"class":1169},"_validate_dates",[1050,5188,1120],{"class":1085},[1050,5190,1330],{"class":1169},[1050,5192,1185],{"class":1085},[1050,5194,5195],{"class":1052,"line":1648},[1050,5196,1352],{"class":1067},[1050,5198,5199],{"class":1052,"line":1653},[1050,5200,5201],{"class":1056},"        # Time validation\n",[1050,5203,5204,5206,5208,5211,5213,5215],{"class":1052,"line":1675},[1050,5205,2623],{"class":1324},[1050,5207,1086],{"class":1085},[1050,5209,5210],{"class":1169},"_validate_times",[1050,5212,1120],{"class":1085},[1050,5214,1330],{"class":1169},[1050,5216,1185],{"class":1085},[1050,5218,5219],{"class":1052,"line":1680},[1050,5220,1352],{"class":1067},[1050,5222,5223],{"class":1052,"line":1686},[1050,5224,5225],{"class":1056},"        # Capacity validation\n",[1050,5227,5228,5230,5232,5235,5237,5239],{"class":1052,"line":1726},[1050,5229,2623],{"class":1324},[1050,5231,1086],{"class":1085},[1050,5233,5234],{"class":1169},"_validate_capacity",[1050,5236,1120],{"class":1085},[1050,5238,1330],{"class":1169},[1050,5240,1185],{"class":1085},[1050,5242,5243],{"class":1052,"line":1759},[1050,5244,1352],{"class":1067},[1050,5246,5247],{"class":1052,"line":1778},[1050,5248,5249],{"class":1056},"        # Budget validation\n",[1050,5251,5252,5254,5256,5259,5261,5263],{"class":1052,"line":1804},[1050,5253,2623],{"class":1324},[1050,5255,1086],{"class":1085},[1050,5257,5258],{"class":1169},"_validate_budget",[1050,5260,1120],{"class":1085},[1050,5262,1330],{"class":1169},[1050,5264,1185],{"class":1085},[1050,5266,5267],{"class":1052,"line":1809},[1050,5268,1352],{"class":1067},[1050,5270,5271],{"class":1052,"line":1817},[1050,5272,5273],{"class":1056},"        # Availability validation\n",[1050,5275,5276,5278,5280,5283,5285,5287],{"class":1052,"line":1822},[1050,5277,2623],{"class":1324},[1050,5279,1086],{"class":1085},[1050,5281,5282],{"class":1169},"_validate_availability",[1050,5284,1120],{"class":1085},[1050,5286,1330],{"class":1169},[1050,5288,1185],{"class":1085},[1050,5290,5291],{"class":1052,"line":1836},[1050,5292,1352],{"class":1067},[1050,5294,5295,5297],{"class":1052,"line":1846},[1050,5296,1588],{"class":1063},[1050,5298,2548],{"class":1067},[1050,5300,5301],{"class":1052,"line":1871},[1050,5302,1152],{"class":1067},[1050,5304,5305,5307,5310,5312,5314,5316,5319],{"class":1052,"line":1876},[1050,5306,1290],{"class":1112},[1050,5308,5309],{"class":1293}," _validate_dates",[1050,5311,1120],{"class":1085},[1050,5313,1300],{"class":1299},[1050,5315,1704],{"class":1085},[1050,5317,5318],{"class":3610}," data",[1050,5320,1132],{"class":1085},[1050,5322,5323,5325,5328],{"class":1052,"line":1890},[1050,5324,1308],{"class":1138},[1050,5326,5327],{"class":1142},"Validate date range",[1050,5329,1146],{"class":1138},[1050,5331,5332,5335,5337,5339,5341,5343,5345,5347,5350,5352],{"class":1052,"line":1895},[1050,5333,5334],{"class":1067},"        start_date ",[1050,5336,1161],{"class":1085},[1050,5338,5318],{"class":1067},[1050,5340,1086],{"class":1085},[1050,5342,2350],{"class":1169},[1050,5344,1120],{"class":1085},[1050,5346,1337],{"class":1336},[1050,5348,5349],{"class":1340},"start_date",[1050,5351,1337],{"class":1336},[1050,5353,1185],{"class":1085},[1050,5355,5356,5359,5361,5363,5365,5367,5369,5371,5374,5376],{"class":1052,"line":1901},[1050,5357,5358],{"class":1067},"        end_date ",[1050,5360,1161],{"class":1085},[1050,5362,5318],{"class":1067},[1050,5364,1086],{"class":1085},[1050,5366,2350],{"class":1169},[1050,5368,1120],{"class":1085},[1050,5370,1337],{"class":1336},[1050,5372,5373],{"class":1340},"end_date",[1050,5375,1337],{"class":1336},[1050,5377,1185],{"class":1085},[1050,5379,5380],{"class":1052,"line":1921},[1050,5381,1352],{"class":1067},[1050,5383,5384,5386,5389,5391,5394],{"class":1052,"line":1939},[1050,5385,1398],{"class":1063},[1050,5387,5388],{"class":1067}," start_date ",[1050,5390,2430],{"class":1411},[1050,5392,5393],{"class":1067}," end_date",[1050,5395,1418],{"class":1085},[1050,5397,5398],{"class":1052,"line":1944},[1050,5399,5400],{"class":1056},"            # End date must be after start date\n",[1050,5402,5403,5405,5408,5410,5413],{"class":1052,"line":1950},[1050,5404,2441],{"class":1063},[1050,5406,5407],{"class":1067}," end_date ",[1050,5409,2186],{"class":1411},[1050,5411,5412],{"class":1067}," start_date",[1050,5414,1418],{"class":1085},[1050,5416,5417,5419,5421,5423,5425,5428,5430],{"class":1052,"line":1965},[1050,5418,2456],{"class":1063},[1050,5420,1427],{"class":1169},[1050,5422,1120],{"class":1085},[1050,5424,1337],{"class":1336},[1050,5426,5427],{"class":1340},"End date must be after start date.",[1050,5429,1337],{"class":1336},[1050,5431,1185],{"class":1085},[1050,5433,5434],{"class":1052,"line":1983},[1050,5435,2764],{"class":1067},[1050,5437,5438],{"class":1052,"line":1988},[1050,5439,5440],{"class":1056},"            # Cannot book in the past\n",[1050,5442,5443,5445,5447,5449,5451,5453,5456],{"class":1052,"line":1994},[1050,5444,2441],{"class":1063},[1050,5446,5388],{"class":1067},[1050,5448,2186],{"class":1411},[1050,5450,4678],{"class":1067},[1050,5452,1086],{"class":1085},[1050,5454,5455],{"class":1169},"today",[1050,5457,1468],{"class":1085},[1050,5459,5460,5462,5464,5466,5468,5471,5473],{"class":1052,"line":2039},[1050,5461,2456],{"class":1063},[1050,5463,1427],{"class":1169},[1050,5465,1120],{"class":1085},[1050,5467,1337],{"class":1336},[1050,5469,5470],{"class":1340},"Cannot book events in the past.",[1050,5472,1337],{"class":1336},[1050,5474,1185],{"class":1085},[1050,5476,5477],{"class":1052,"line":2061},[1050,5478,2764],{"class":1067},[1050,5480,5481],{"class":1052,"line":2079},[1050,5482,5483],{"class":1056},"            # Maximum booking duration\n",[1050,5485,5486,5488,5490,5493,5496,5498,5500,5503,5505,5508],{"class":1052,"line":2084},[1050,5487,2441],{"class":1063},[1050,5489,3968],{"class":1085},[1050,5491,5492],{"class":1067},"end_date ",[1050,5494,5495],{"class":1411},"-",[1050,5497,5412],{"class":1067},[1050,5499,1554],{"class":1085},[1050,5501,5502],{"class":1231},"days",[1050,5504,3936],{"class":1411},[1050,5506,5507],{"class":1181}," 30",[1050,5509,1418],{"class":1085},[1050,5511,5512,5514,5516,5518,5520,5523,5525],{"class":1052,"line":2092},[1050,5513,2456],{"class":1063},[1050,5515,1427],{"class":1169},[1050,5517,1120],{"class":1085},[1050,5519,1337],{"class":1336},[1050,5521,5522],{"class":1340},"Events cannot exceed 30 days.",[1050,5524,1337],{"class":1336},[1050,5526,1185],{"class":1085},[1050,5528,5529],{"class":1052,"line":2097},[1050,5530,2764],{"class":1067},[1050,5532,5533],{"class":1052,"line":2111},[1050,5534,5535],{"class":1056},"            # Minimum advance booking\n",[1050,5537,5538,5540,5542,5544,5546,5548,5550,5552,5555,5558,5560,5562,5564,5566],{"class":1052,"line":2121},[1050,5539,2441],{"class":1063},[1050,5541,5388],{"class":1067},[1050,5543,2186],{"class":1411},[1050,5545,4678],{"class":1067},[1050,5547,1086],{"class":1085},[1050,5549,5455],{"class":1169},[1050,5551,2051],{"class":1085},[1050,5553,5554],{"class":1411}," +",[1050,5556,5557],{"class":1169}," timedelta",[1050,5559,1120],{"class":1085},[1050,5561,5502],{"class":1175},[1050,5563,1161],{"class":1085},[1050,5565,3354],{"class":1181},[1050,5567,1132],{"class":1085},[1050,5569,5570,5572,5574,5576,5578,5581,5583],{"class":1052,"line":2146},[1050,5571,2456],{"class":1063},[1050,5573,1427],{"class":1169},[1050,5575,1120],{"class":1085},[1050,5577,1337],{"class":1336},[1050,5579,5580],{"class":1340},"Events must be booked at least 2 days in advance.",[1050,5582,1337],{"class":1336},[1050,5584,1185],{"class":1085},[1050,5586,5587],{"class":1052,"line":2151},[1050,5588,1152],{"class":1067},[1050,5590,5591,5593,5596,5598,5600,5602,5604],{"class":1052,"line":2173},[1050,5592,1290],{"class":1112},[1050,5594,5595],{"class":1293}," _validate_times",[1050,5597,1120],{"class":1085},[1050,5599,1300],{"class":1299},[1050,5601,1704],{"class":1085},[1050,5603,5318],{"class":3610},[1050,5605,1132],{"class":1085},[1050,5607,5608,5610,5613],{"class":1052,"line":2178},[1050,5609,1308],{"class":1138},[1050,5611,5612],{"class":1142},"Validate time range",[1050,5614,1146],{"class":1138},[1050,5616,5617,5620,5622,5624,5626,5628,5630,5632,5635,5637],{"class":1052,"line":2194},[1050,5618,5619],{"class":1067},"        start_time ",[1050,5621,1161],{"class":1085},[1050,5623,5318],{"class":1067},[1050,5625,1086],{"class":1085},[1050,5627,2350],{"class":1169},[1050,5629,1120],{"class":1085},[1050,5631,1337],{"class":1336},[1050,5633,5634],{"class":1340},"start_time",[1050,5636,1337],{"class":1336},[1050,5638,1185],{"class":1085},[1050,5640,5641,5644,5646,5648,5650,5652,5654,5656,5659,5661],{"class":1052,"line":2212},[1050,5642,5643],{"class":1067},"        end_time ",[1050,5645,1161],{"class":1085},[1050,5647,5318],{"class":1067},[1050,5649,1086],{"class":1085},[1050,5651,2350],{"class":1169},[1050,5653,1120],{"class":1085},[1050,5655,1337],{"class":1336},[1050,5657,5658],{"class":1340},"end_time",[1050,5660,1337],{"class":1336},[1050,5662,1185],{"class":1085},[1050,5664,5665,5667,5669,5671,5673,5675,5677,5679,5681,5683],{"class":1052,"line":2217},[1050,5666,5334],{"class":1067},[1050,5668,1161],{"class":1085},[1050,5670,5318],{"class":1067},[1050,5672,1086],{"class":1085},[1050,5674,2350],{"class":1169},[1050,5676,1120],{"class":1085},[1050,5678,1337],{"class":1336},[1050,5680,5349],{"class":1340},[1050,5682,1337],{"class":1336},[1050,5684,1185],{"class":1085},[1050,5686,5687,5689,5691,5693,5695,5697,5699,5701,5703,5705],{"class":1052,"line":2232},[1050,5688,5358],{"class":1067},[1050,5690,1161],{"class":1085},[1050,5692,5318],{"class":1067},[1050,5694,1086],{"class":1085},[1050,5696,2350],{"class":1169},[1050,5698,1120],{"class":1085},[1050,5700,1337],{"class":1336},[1050,5702,5373],{"class":1340},[1050,5704,1337],{"class":1336},[1050,5706,1185],{"class":1085},[1050,5708,5709],{"class":1052,"line":2250},[1050,5710,1352],{"class":1067},[1050,5712,5713,5715,5718,5720,5723,5725,5727,5729,5731],{"class":1052,"line":2255},[1050,5714,1398],{"class":1063},[1050,5716,5717],{"class":1067}," start_time ",[1050,5719,2430],{"class":1411},[1050,5721,5722],{"class":1067}," end_time ",[1050,5724,2430],{"class":1411},[1050,5726,5388],{"class":1067},[1050,5728,2430],{"class":1411},[1050,5730,5393],{"class":1067},[1050,5732,1418],{"class":1085},[1050,5734,5735],{"class":1052,"line":2263},[1050,5736,5737],{"class":1056},"            # For same-day events, end time must be after start time\n",[1050,5739,5740,5742,5744,5747,5749,5751,5753,5755,5758],{"class":1052,"line":2268},[1050,5741,2441],{"class":1063},[1050,5743,5388],{"class":1067},[1050,5745,5746],{"class":1411},"==",[1050,5748,5407],{"class":1067},[1050,5750,2430],{"class":1411},[1050,5752,5722],{"class":1067},[1050,5754,4387],{"class":1411},[1050,5756,5757],{"class":1067}," start_time",[1050,5759,1418],{"class":1085},[1050,5761,5762,5764,5766,5768,5770,5773,5775],{"class":1052,"line":2282},[1050,5763,2456],{"class":1063},[1050,5765,1427],{"class":1169},[1050,5767,1120],{"class":1085},[1050,5769,1337],{"class":1336},[1050,5771,5772],{"class":1340},"End time must be after start time for same-day events.",[1050,5774,1337],{"class":1336},[1050,5776,1185],{"class":1085},[1050,5778,5779],{"class":1052,"line":2292},[1050,5780,2764],{"class":1067},[1050,5782,5783],{"class":1052,"line":2312},[1050,5784,5785],{"class":1056},"            # Business hours validation\n",[1050,5787,5788,5791,5793,5795],{"class":1052,"line":2317},[1050,5789,5790],{"class":1063},"            from",[1050,5792,4312],{"class":1067},[1050,5794,1071],{"class":1063},[1050,5796,4317],{"class":1067},[1050,5798,5799,5802,5804,5806,5808,5811,5813,5815],{"class":1052,"line":2333},[1050,5800,5801],{"class":1067},"            business_start ",[1050,5803,1161],{"class":1085},[1050,5805,4331],{"class":1169},[1050,5807,1120],{"class":1085},[1050,5809,5810],{"class":1181},"8",[1050,5812,1704],{"class":1085},[1050,5814,4341],{"class":1181},[1050,5816,1185],{"class":1085},[1050,5818,5819,5822,5824,5826,5828,5831,5833,5835],{"class":1052,"line":2338},[1050,5820,5821],{"class":1067},"            business_end ",[1050,5823,1161],{"class":1085},[1050,5825,4331],{"class":1169},[1050,5827,1120],{"class":1085},[1050,5829,5830],{"class":1181},"22",[1050,5832,1704],{"class":1085},[1050,5834,4341],{"class":1181},[1050,5836,1185],{"class":1085},[1050,5838,5839],{"class":1052,"line":2363},[1050,5840,2764],{"class":1067},[1050,5842,5843,5845,5847,5849,5851,5853,5855,5857,5859],{"class":1052,"line":2388},[1050,5844,2441],{"class":1063},[1050,5846,1457],{"class":1411},[1050,5848,3968],{"class":1085},[1050,5850,4384],{"class":1067},[1050,5852,4387],{"class":1411},[1050,5854,5717],{"class":1067},[1050,5856,4387],{"class":1411},[1050,5858,4395],{"class":1067},[1050,5860,1132],{"class":1085},[1050,5862,5863,5865,5867,5869,5871,5874,5876],{"class":1052,"line":2411},[1050,5864,2456],{"class":1063},[1050,5866,1427],{"class":1169},[1050,5868,1120],{"class":1085},[1050,5870,1337],{"class":1336},[1050,5872,5873],{"class":1340},"Start time must be within business hours (8:00 AM - 10:00 PM).",[1050,5875,1337],{"class":1336},[1050,5877,1185],{"class":1085},[1050,5879,5880],{"class":1052,"line":2416},[1050,5881,2764],{"class":1067},[1050,5883,5884,5886,5888,5890,5892,5894,5896,5898,5900],{"class":1052,"line":2422},[1050,5885,2441],{"class":1063},[1050,5887,1457],{"class":1411},[1050,5889,3968],{"class":1085},[1050,5891,4384],{"class":1067},[1050,5893,4387],{"class":1411},[1050,5895,5722],{"class":1067},[1050,5897,4387],{"class":1411},[1050,5899,4395],{"class":1067},[1050,5901,1132],{"class":1085},[1050,5903,5904,5906,5908,5910,5912,5915,5917],{"class":1052,"line":2438},[1050,5905,2456],{"class":1063},[1050,5907,1427],{"class":1169},[1050,5909,1120],{"class":1085},[1050,5911,1337],{"class":1336},[1050,5913,5914],{"class":1340},"End time must be within business hours (8:00 AM - 10:00 PM).",[1050,5916,1337],{"class":1336},[1050,5918,1185],{"class":1085},[1050,5920,5921],{"class":1052,"line":2453},[1050,5922,1152],{"class":1067},[1050,5924,5925,5927,5930,5932,5934,5936,5938],{"class":1052,"line":2472},[1050,5926,1290],{"class":1112},[1050,5928,5929],{"class":1293}," _validate_capacity",[1050,5931,1120],{"class":1085},[1050,5933,1300],{"class":1299},[1050,5935,1704],{"class":1085},[1050,5937,5318],{"class":3610},[1050,5939,1132],{"class":1085},[1050,5941,5942,5944,5947],{"class":1052,"line":2477},[1050,5943,1308],{"class":1138},[1050,5945,5946],{"class":1142},"Validate room capacity vs attendees",[1050,5948,1146],{"class":1138},[1050,5950,5951,5954,5956,5958,5960,5962,5964,5966,5969,5971],{"class":1052,"line":2483},[1050,5952,5953],{"class":1067},"        room_type ",[1050,5955,1161],{"class":1085},[1050,5957,5318],{"class":1067},[1050,5959,1086],{"class":1085},[1050,5961,2350],{"class":1169},[1050,5963,1120],{"class":1085},[1050,5965,1337],{"class":1336},[1050,5967,5968],{"class":1340},"room_type",[1050,5970,1337],{"class":1336},[1050,5972,1185],{"class":1085},[1050,5974,5975,5978,5980,5982,5984,5986,5988,5990,5993,5995],{"class":1052,"line":2497},[1050,5976,5977],{"class":1067},"        attendees ",[1050,5979,1161],{"class":1085},[1050,5981,5318],{"class":1067},[1050,5983,1086],{"class":1085},[1050,5985,2350],{"class":1169},[1050,5987,1120],{"class":1085},[1050,5989,1337],{"class":1336},[1050,5991,5992],{"class":1340},"attendees",[1050,5994,1337],{"class":1336},[1050,5996,1185],{"class":1085},[1050,5998,5999],{"class":1052,"line":2520},[1050,6000,1352],{"class":1067},[1050,6002,6003,6005,6008,6010,6013],{"class":1052,"line":2538},[1050,6004,1398],{"class":1063},[1050,6006,6007],{"class":1067}," room_type ",[1050,6009,2430],{"class":1411},[1050,6011,6012],{"class":1067}," attendees",[1050,6014,1418],{"class":1085},[1050,6016,6017,6020,6022],{"class":1052,"line":2543},[1050,6018,6019],{"class":1067},"            capacity_limits ",[1050,6021,1161],{"class":1085},[1050,6023,6024],{"class":1085}," {\n",[1050,6026,6027,6030,6032,6034,6037,6040],{"class":1052,"line":2551},[1050,6028,6029],{"class":1336},"                '",[1050,6031,4894],{"class":1340},[1050,6033,1337],{"class":1336},[1050,6035,6036],{"class":1085},":",[1050,6038,6039],{"class":1181}," 10",[1050,6041,2887],{"class":1085},[1050,6043,6044,6046,6048,6050,6052,6055],{"class":1052,"line":2556},[1050,6045,6029],{"class":1336},[1050,6047,4916],{"class":1340},[1050,6049,1337],{"class":1336},[1050,6051,6036],{"class":1085},[1050,6053,6054],{"class":1181}," 25",[1050,6056,2887],{"class":1085},[1050,6058,6059,6061,6063,6065,6067,6070],{"class":1052,"line":2570},[1050,6060,6029],{"class":1336},[1050,6062,4938],{"class":1340},[1050,6064,1337],{"class":1336},[1050,6066,6036],{"class":1085},[1050,6068,6069],{"class":1181}," 50",[1050,6071,2887],{"class":1085},[1050,6073,6074,6076,6078,6080,6082],{"class":1052,"line":2580},[1050,6075,6029],{"class":1336},[1050,6077,4960],{"class":1340},[1050,6079,1337],{"class":1336},[1050,6081,6036],{"class":1085},[1050,6083,6084],{"class":1181}," 200\n",[1050,6086,6087],{"class":1052,"line":2596},[1050,6088,6089],{"class":1085},"            }\n",[1050,6091,6092],{"class":1052,"line":2609},[1050,6093,2764],{"class":1067},[1050,6095,6096,6099,6101,6104,6106,6108,6110,6112,6114,6116],{"class":1052,"line":2614},[1050,6097,6098],{"class":1067},"            max_capacity ",[1050,6100,1161],{"class":1085},[1050,6102,6103],{"class":1067}," capacity_limits",[1050,6105,1086],{"class":1085},[1050,6107,2350],{"class":1169},[1050,6109,1120],{"class":1085},[1050,6111,5968],{"class":1169},[1050,6113,1704],{"class":1085},[1050,6115,4341],{"class":1181},[1050,6117,1185],{"class":1085},[1050,6119,6120,6122,6125,6127,6130],{"class":1052,"line":2620},[1050,6121,2441],{"class":1063},[1050,6123,6124],{"class":1067}," attendees ",[1050,6126,2224],{"class":1411},[1050,6128,6129],{"class":1067}," max_capacity",[1050,6131,1418],{"class":1085},[1050,6133,6134,6136,6138],{"class":1052,"line":2633},[1050,6135,2456],{"class":1063},[1050,6137,1427],{"class":1169},[1050,6139,2980],{"class":1085},[1050,6141,6142,6145,6148,6150,6153,6155],{"class":1052,"line":2638},[1050,6143,6144],{"class":1112},"                    f",[1050,6146,6147],{"class":1340},"'Selected room can accommodate maximum ",[1050,6149,1371],{"class":1370},[1050,6151,6152],{"class":1169},"max_capacity",[1050,6154,1376],{"class":1370},[1050,6156,6157],{"class":1340}," people. '\n",[1050,6159,6160,6162,6165,6167,6169,6171],{"class":1052,"line":2652},[1050,6161,6144],{"class":1112},[1050,6163,6164],{"class":1340},"'You have ",[1050,6166,1371],{"class":1370},[1050,6168,5992],{"class":1169},[1050,6170,1376],{"class":1370},[1050,6172,6173],{"class":1340}," attendees.'\n",[1050,6175,6176],{"class":1052,"line":2662},[1050,6177,6178],{"class":1085},"                )\n",[1050,6180,6181],{"class":1052,"line":2678},[1050,6182,1152],{"class":1067},[1050,6184,6185,6187,6190,6192,6194,6196,6198],{"class":1052,"line":2683},[1050,6186,1290],{"class":1112},[1050,6188,6189],{"class":1293}," _validate_budget",[1050,6191,1120],{"class":1085},[1050,6193,1300],{"class":1299},[1050,6195,1704],{"class":1085},[1050,6197,5318],{"class":3610},[1050,6199,1132],{"class":1085},[1050,6201,6202,6204,6207],{"class":1052,"line":2705},[1050,6203,1308],{"class":1138},[1050,6205,6206],{"class":1142},"Validate budget against estimated costs",[1050,6208,1146],{"class":1138},[1050,6210,6211,6213,6215,6217,6219,6221,6223,6225,6227,6229],{"class":1052,"line":2733},[1050,6212,5953],{"class":1067},[1050,6214,1161],{"class":1085},[1050,6216,5318],{"class":1067},[1050,6218,1086],{"class":1085},[1050,6220,2350],{"class":1169},[1050,6222,1120],{"class":1085},[1050,6224,1337],{"class":1336},[1050,6226,5968],{"class":1340},[1050,6228,1337],{"class":1336},[1050,6230,1185],{"class":1085},[1050,6232,6233,6236,6238,6240,6242,6244,6246,6248,6251,6253],{"class":1052,"line":2761},[1050,6234,6235],{"class":1067},"        budget ",[1050,6237,1161],{"class":1085},[1050,6239,5318],{"class":1067},[1050,6241,1086],{"class":1085},[1050,6243,2350],{"class":1169},[1050,6245,1120],{"class":1085},[1050,6247,1337],{"class":1336},[1050,6249,6250],{"class":1340},"budget",[1050,6252,1337],{"class":1336},[1050,6254,1185],{"class":1085},[1050,6256,6257,6259,6261,6263,6265,6267,6269,6271,6273,6275],{"class":1052,"line":2767},[1050,6258,5334],{"class":1067},[1050,6260,1161],{"class":1085},[1050,6262,5318],{"class":1067},[1050,6264,1086],{"class":1085},[1050,6266,2350],{"class":1169},[1050,6268,1120],{"class":1085},[1050,6270,1337],{"class":1336},[1050,6272,5349],{"class":1340},[1050,6274,1337],{"class":1336},[1050,6276,1185],{"class":1085},[1050,6278,6279,6281,6283,6285,6287,6289,6291,6293,6295,6297],{"class":1052,"line":2773},[1050,6280,5358],{"class":1067},[1050,6282,1161],{"class":1085},[1050,6284,5318],{"class":1067},[1050,6286,1086],{"class":1085},[1050,6288,2350],{"class":1169},[1050,6290,1120],{"class":1085},[1050,6292,1337],{"class":1336},[1050,6294,5373],{"class":1340},[1050,6296,1337],{"class":1336},[1050,6298,1185],{"class":1085},[1050,6300,6301,6304,6306,6308,6310,6312,6314,6316,6319,6321,6323,6326],{"class":1052,"line":2796},[1050,6302,6303],{"class":1067},"        catering ",[1050,6305,1161],{"class":1085},[1050,6307,5318],{"class":1067},[1050,6309,1086],{"class":1085},[1050,6311,2350],{"class":1169},[1050,6313,1120],{"class":1085},[1050,6315,1337],{"class":1336},[1050,6317,6318],{"class":1340},"catering",[1050,6320,1337],{"class":1336},[1050,6322,1704],{"class":1085},[1050,6324,6325],{"class":2809}," False",[1050,6327,1185],{"class":1085},[1050,6329,6331,6334,6336,6338,6340,6342,6344,6346,6349,6351,6353,6355],{"class":1052,"line":6330},125,[1050,6332,6333],{"class":1067},"        av_equipment ",[1050,6335,1161],{"class":1085},[1050,6337,5318],{"class":1067},[1050,6339,1086],{"class":1085},[1050,6341,2350],{"class":1169},[1050,6343,1120],{"class":1085},[1050,6345,1337],{"class":1336},[1050,6347,6348],{"class":1340},"av_equipment",[1050,6350,1337],{"class":1336},[1050,6352,1704],{"class":1085},[1050,6354,6325],{"class":2809},[1050,6356,1185],{"class":1085},[1050,6358,6360,6363,6365,6367,6369,6371,6373,6375,6378,6380,6382,6384],{"class":1052,"line":6359},126,[1050,6361,6362],{"class":1067},"        parking ",[1050,6364,1161],{"class":1085},[1050,6366,5318],{"class":1067},[1050,6368,1086],{"class":1085},[1050,6370,2350],{"class":1169},[1050,6372,1120],{"class":1085},[1050,6374,1337],{"class":1336},[1050,6376,6377],{"class":1340},"parking",[1050,6379,1337],{"class":1336},[1050,6381,1704],{"class":1085},[1050,6383,6325],{"class":2809},[1050,6385,1185],{"class":1085},[1050,6387,6389,6391,6393,6395,6397,6399,6401,6403,6405,6407,6409,6411],{"class":1052,"line":6388},127,[1050,6390,5977],{"class":1067},[1050,6392,1161],{"class":1085},[1050,6394,5318],{"class":1067},[1050,6396,1086],{"class":1085},[1050,6398,2350],{"class":1169},[1050,6400,1120],{"class":1085},[1050,6402,1337],{"class":1336},[1050,6404,5992],{"class":1340},[1050,6406,1337],{"class":1336},[1050,6408,1704],{"class":1085},[1050,6410,4341],{"class":1181},[1050,6412,1185],{"class":1085},[1050,6414,6416],{"class":1052,"line":6415},128,[1050,6417,1352],{"class":1067},[1050,6419,6421,6423,6426,6429,6431,6433,6436,6438,6440,6442,6444],{"class":1052,"line":6420},129,[1050,6422,1398],{"class":1063},[1050,6424,6425],{"class":1358}," all",[1050,6427,6428],{"class":1085},"([",[1050,6430,5968],{"class":1169},[1050,6432,1704],{"class":1085},[1050,6434,6435],{"class":1169}," budget",[1050,6437,1704],{"class":1085},[1050,6439,5412],{"class":1169},[1050,6441,1704],{"class":1085},[1050,6443,5393],{"class":1169},[1050,6445,6446],{"class":1085},"]):\n",[1050,6448,6450],{"class":1052,"line":6449},130,[1050,6451,6452],{"class":1056},"            # Calculate estimated cost\n",[1050,6454,6456,6459,6461],{"class":1052,"line":6455},131,[1050,6457,6458],{"class":1067},"            room_costs ",[1050,6460,1161],{"class":1085},[1050,6462,6024],{"class":1085},[1050,6464,6466,6468,6470,6472,6474,6477],{"class":1052,"line":6465},132,[1050,6467,6029],{"class":1336},[1050,6469,4894],{"class":1340},[1050,6471,1337],{"class":1336},[1050,6473,6036],{"class":1085},[1050,6475,6476],{"class":1181}," 100",[1050,6478,2887],{"class":1085},[1050,6480,6482,6484,6486,6488,6490,6493],{"class":1052,"line":6481},133,[1050,6483,6029],{"class":1336},[1050,6485,4916],{"class":1340},[1050,6487,1337],{"class":1336},[1050,6489,6036],{"class":1085},[1050,6491,6492],{"class":1181}," 200",[1050,6494,2887],{"class":1085},[1050,6496,6498,6500,6502,6504,6506,6509],{"class":1052,"line":6497},134,[1050,6499,6029],{"class":1336},[1050,6501,4938],{"class":1340},[1050,6503,1337],{"class":1336},[1050,6505,6036],{"class":1085},[1050,6507,6508],{"class":1181}," 300",[1050,6510,2887],{"class":1085},[1050,6512,6514,6516,6518,6520,6522],{"class":1052,"line":6513},135,[1050,6515,6029],{"class":1336},[1050,6517,4960],{"class":1340},[1050,6519,1337],{"class":1336},[1050,6521,6036],{"class":1085},[1050,6523,6524],{"class":1181}," 500\n",[1050,6526,6528],{"class":1052,"line":6527},136,[1050,6529,6089],{"class":1085},[1050,6531,6533],{"class":1052,"line":6532},137,[1050,6534,2764],{"class":1067},[1050,6536,6538,6541,6543,6545,6547,6549,6551,6553,6555,6557],{"class":1052,"line":6537},138,[1050,6539,6540],{"class":1067},"            days ",[1050,6542,1161],{"class":1085},[1050,6544,3968],{"class":1085},[1050,6546,5492],{"class":1067},[1050,6548,5495],{"class":1411},[1050,6550,5412],{"class":1067},[1050,6552,1554],{"class":1085},[1050,6554,5502],{"class":1231},[1050,6556,5554],{"class":1411},[1050,6558,6559],{"class":1181}," 1\n",[1050,6561,6563,6566,6568,6571,6573,6575,6577,6579,6581,6583,6585,6587],{"class":1052,"line":6562},139,[1050,6564,6565],{"class":1067},"            room_cost ",[1050,6567,1161],{"class":1085},[1050,6569,6570],{"class":1067}," room_costs",[1050,6572,1086],{"class":1085},[1050,6574,2350],{"class":1169},[1050,6576,1120],{"class":1085},[1050,6578,5968],{"class":1169},[1050,6580,1704],{"class":1085},[1050,6582,4341],{"class":1181},[1050,6584,1408],{"class":1085},[1050,6586,3910],{"class":1411},[1050,6588,6589],{"class":1067}," days\n",[1050,6591,6593],{"class":1052,"line":6592},140,[1050,6594,2764],{"class":1067},[1050,6596,6598,6601,6603],{"class":1052,"line":6597},141,[1050,6599,6600],{"class":1067},"            additional_costs ",[1050,6602,1161],{"class":1085},[1050,6604,6605],{"class":1181}," 0\n",[1050,6607,6609,6611,6614],{"class":1052,"line":6608},142,[1050,6610,2441],{"class":1063},[1050,6612,6613],{"class":1067}," catering",[1050,6615,1418],{"class":1085},[1050,6617,6619,6622,6625,6627,6629,6631],{"class":1052,"line":6618},143,[1050,6620,6621],{"class":1067},"                additional_costs ",[1050,6623,6624],{"class":1085},"+=",[1050,6626,6124],{"class":1067},[1050,6628,3974],{"class":1411},[1050,6630,6054],{"class":1181},[1050,6632,6633],{"class":1056},"  # $25 per person\n",[1050,6635,6637,6639,6642],{"class":1052,"line":6636},144,[1050,6638,2441],{"class":1063},[1050,6640,6641],{"class":1067}," av_equipment",[1050,6643,1418],{"class":1085},[1050,6645,6647,6649,6651,6654,6656],{"class":1052,"line":6646},145,[1050,6648,6621],{"class":1067},[1050,6650,6624],{"class":1085},[1050,6652,6653],{"class":1181}," 150",[1050,6655,3910],{"class":1411},[1050,6657,6589],{"class":1067},[1050,6659,6661,6663,6666],{"class":1052,"line":6660},146,[1050,6662,2441],{"class":1063},[1050,6664,6665],{"class":1067}," parking",[1050,6667,1418],{"class":1085},[1050,6669,6671,6673,6675,6677,6679],{"class":1052,"line":6670},147,[1050,6672,6621],{"class":1067},[1050,6674,6624],{"class":1085},[1050,6676,6069],{"class":1181},[1050,6678,3910],{"class":1411},[1050,6680,6589],{"class":1067},[1050,6682,6684],{"class":1052,"line":6683},148,[1050,6685,2764],{"class":1067},[1050,6687,6689,6692,6694,6697,6699],{"class":1052,"line":6688},149,[1050,6690,6691],{"class":1067},"            total_estimated_cost ",[1050,6693,1161],{"class":1085},[1050,6695,6696],{"class":1067}," room_cost ",[1050,6698,3191],{"class":1411},[1050,6700,6701],{"class":1067}," additional_costs\n",[1050,6703,6705],{"class":1052,"line":6704},150,[1050,6706,2764],{"class":1067},[1050,6708,6710,6712,6715,6717,6720],{"class":1052,"line":6709},151,[1050,6711,2441],{"class":1063},[1050,6713,6714],{"class":1067}," budget ",[1050,6716,2186],{"class":1411},[1050,6718,6719],{"class":1067}," total_estimated_cost",[1050,6721,1418],{"class":1085},[1050,6723,6725,6727,6729],{"class":1052,"line":6724},152,[1050,6726,2456],{"class":1063},[1050,6728,1427],{"class":1169},[1050,6730,2980],{"class":1085},[1050,6732,6734,6736,6739,6741,6743,6745],{"class":1052,"line":6733},153,[1050,6735,6144],{"class":1112},[1050,6737,6738],{"class":1340},"'Budget ($",[1050,6740,1371],{"class":1370},[1050,6742,6250],{"class":1169},[1050,6744,1376],{"class":1370},[1050,6746,6747],{"class":1340},") is insufficient. '\n",[1050,6749,6751,6753,6756,6758,6761,6763],{"class":1052,"line":6750},154,[1050,6752,6144],{"class":1112},[1050,6754,6755],{"class":1340},"'Estimated cost: $",[1050,6757,1371],{"class":1370},[1050,6759,6760],{"class":1169},"total_estimated_cost",[1050,6762,1376],{"class":1370},[1050,6764,6765],{"class":1340}," '\n",[1050,6767,6769,6771,6774,6776,6779,6781,6784,6786,6789,6791],{"class":1052,"line":6768},155,[1050,6770,6144],{"class":1112},[1050,6772,6773],{"class":1340},"'(Room: $",[1050,6775,1371],{"class":1370},[1050,6777,6778],{"class":1169},"room_cost",[1050,6780,1376],{"class":1370},[1050,6782,6783],{"class":1340},", Additional: $",[1050,6785,1371],{"class":1370},[1050,6787,6788],{"class":1169},"additional_costs",[1050,6790,1376],{"class":1370},[1050,6792,6793],{"class":1340},")'\n",[1050,6795,6797],{"class":1052,"line":6796},156,[1050,6798,6178],{"class":1085},[1050,6800,6802],{"class":1052,"line":6801},157,[1050,6803,1152],{"class":1067},[1050,6805,6807,6809,6812,6814,6816,6818,6820],{"class":1052,"line":6806},158,[1050,6808,1290],{"class":1112},[1050,6810,6811],{"class":1293}," _validate_availability",[1050,6813,1120],{"class":1085},[1050,6815,1300],{"class":1299},[1050,6817,1704],{"class":1085},[1050,6819,5318],{"class":3610},[1050,6821,1132],{"class":1085},[1050,6823,6825,6827,6830],{"class":1052,"line":6824},159,[1050,6826,1308],{"class":1138},[1050,6828,6829],{"class":1142},"Check room availability (simplified)",[1050,6831,1146],{"class":1138},[1050,6833,6835,6837,6839,6841,6843,6845,6847,6849,6851,6853],{"class":1052,"line":6834},160,[1050,6836,5953],{"class":1067},[1050,6838,1161],{"class":1085},[1050,6840,5318],{"class":1067},[1050,6842,1086],{"class":1085},[1050,6844,2350],{"class":1169},[1050,6846,1120],{"class":1085},[1050,6848,1337],{"class":1336},[1050,6850,5968],{"class":1340},[1050,6852,1337],{"class":1336},[1050,6854,1185],{"class":1085},[1050,6856,6858,6860,6862,6864,6866,6868,6870,6872,6874,6876],{"class":1052,"line":6857},161,[1050,6859,5334],{"class":1067},[1050,6861,1161],{"class":1085},[1050,6863,5318],{"class":1067},[1050,6865,1086],{"class":1085},[1050,6867,2350],{"class":1169},[1050,6869,1120],{"class":1085},[1050,6871,1337],{"class":1336},[1050,6873,5349],{"class":1340},[1050,6875,1337],{"class":1336},[1050,6877,1185],{"class":1085},[1050,6879,6881,6883,6885,6887,6889,6891,6893,6895,6897,6899],{"class":1052,"line":6880},162,[1050,6882,5358],{"class":1067},[1050,6884,1161],{"class":1085},[1050,6886,5318],{"class":1067},[1050,6888,1086],{"class":1085},[1050,6890,2350],{"class":1169},[1050,6892,1120],{"class":1085},[1050,6894,1337],{"class":1336},[1050,6896,5373],{"class":1340},[1050,6898,1337],{"class":1336},[1050,6900,1185],{"class":1085},[1050,6902,6904],{"class":1052,"line":6903},163,[1050,6905,1352],{"class":1067},[1050,6907,6909,6911,6913,6915,6917,6919,6921,6923,6925],{"class":1052,"line":6908},164,[1050,6910,1398],{"class":1063},[1050,6912,6425],{"class":1358},[1050,6914,6428],{"class":1085},[1050,6916,5968],{"class":1169},[1050,6918,1704],{"class":1085},[1050,6920,5412],{"class":1169},[1050,6922,1704],{"class":1085},[1050,6924,5393],{"class":1169},[1050,6926,6446],{"class":1085},[1050,6928,6930],{"class":1052,"line":6929},165,[1050,6931,6932],{"class":1056},"            # In a real application, check against booking database\n",[1050,6934,6936],{"class":1052,"line":6935},166,[1050,6937,6938],{"class":1056},"            # This is a simplified example\n",[1050,6940,6942],{"class":1052,"line":6941},167,[1050,6943,2764],{"class":1067},[1050,6945,6947],{"class":1052,"line":6946},168,[1050,6948,6949],{"class":1056},"            # Simulate checking availability\n",[1050,6951,6953,6955,6958,6960,6962],{"class":1052,"line":6952},169,[1050,6954,5790],{"class":1063},[1050,6956,6957],{"class":1085}," .",[1050,6959,1520],{"class":1067},[1050,6961,1071],{"class":1063},[1050,6963,6964],{"class":1067}," Booking\n",[1050,6966,6968],{"class":1052,"line":6967},170,[1050,6969,2764],{"class":1067},[1050,6971,6973,6976,6978,6981,6983,6985,6987,6989],{"class":1052,"line":6972},171,[1050,6974,6975],{"class":1067},"            conflicting_bookings ",[1050,6977,1161],{"class":1085},[1050,6979,6980],{"class":1067}," Booking",[1050,6982,1086],{"class":1085},[1050,6984,1538],{"class":1231},[1050,6986,1086],{"class":1085},[1050,6988,1543],{"class":1169},[1050,6990,2980],{"class":1085},[1050,6992,6994,6997,6999,7001],{"class":1052,"line":6993},172,[1050,6995,6996],{"class":1175},"                room_type",[1050,6998,1161],{"class":1085},[1050,7000,5968],{"class":1169},[1050,7002,2887],{"class":1085},[1050,7004,7006,7009,7011,7013],{"class":1052,"line":7005},173,[1050,7007,7008],{"class":1175},"                start_date__lte",[1050,7010,1161],{"class":1085},[1050,7012,5373],{"class":1169},[1050,7014,2887],{"class":1085},[1050,7016,7018,7021,7023],{"class":1052,"line":7017},174,[1050,7019,7020],{"class":1175},"                end_date__gte",[1050,7022,1161],{"class":1085},[1050,7024,7025],{"class":1169},"start_date\n",[1050,7027,7029],{"class":1052,"line":7028},175,[1050,7030,3069],{"class":1085},[1050,7032,7034],{"class":1052,"line":7033},176,[1050,7035,2764],{"class":1067},[1050,7037,7039,7041,7044,7046,7048],{"class":1052,"line":7038},177,[1050,7040,2441],{"class":1063},[1050,7042,7043],{"class":1067}," conflicting_bookings",[1050,7045,1086],{"class":1085},[1050,7047,1557],{"class":1169},[1050,7049,1468],{"class":1085},[1050,7051,7053,7055,7057],{"class":1052,"line":7052},178,[1050,7054,2456],{"class":1063},[1050,7056,1427],{"class":1169},[1050,7058,2980],{"class":1085},[1050,7060,7062,7064],{"class":1052,"line":7061},179,[1050,7063,6144],{"class":1112},[1050,7065,7066],{"class":1340},"'Selected room is not available for the chosen dates. '\n",[1050,7068,7070,7072],{"class":1052,"line":7069},180,[1050,7071,6144],{"class":1112},[1050,7073,7074],{"class":1340},"'Please select different dates or room type.'\n",[1050,7076,7078],{"class":1052,"line":7077},181,[1050,7079,6178],{"class":1085},[1030,7081,7083],{"id":7082},"dynamic-validation","Dynamic Validation",[1035,7085,7087],{"id":7086},"conditional-validation-rules","Conditional Validation Rules",[1040,7089,7091],{"className":1042,"code":7090,"language":1044,"meta":1045,"style":1045},"# forms.py - Dynamic validation based on form state\nfrom django import forms\n\nclass DynamicValidationForm(forms.Form):\n    \"\"\"Form with validation rules that change based on user input\"\"\"\n    \n    USER_TYPES = [\n        ('individual', 'Individual'),\n        ('business', 'Business'),\n        ('nonprofit', 'Non-Profit Organization'),\n    ]\n    \n    user_type = forms.ChoiceField(choices=USER_TYPES)\n    \n    # Common fields\n    email = forms.EmailField()\n    phone = forms.CharField(max_length=15)\n    \n    # Individual fields\n    first_name = forms.CharField(max_length=30, required=False)\n    last_name = forms.CharField(max_length=30, required=False)\n    date_of_birth = forms.DateField(required=False)\n    \n    # Business fields\n    company_name = forms.CharField(max_length=100, required=False)\n    tax_id = forms.CharField(max_length=20, required=False)\n    annual_revenue = forms.DecimalField(max_digits=12, decimal_places=2, required=False)\n    \n    # Non-profit fields\n    organization_name = forms.CharField(max_length=100, required=False)\n    nonprofit_id = forms.CharField(max_length=20, required=False)\n    mission_statement = forms.CharField(widget=forms.Textarea, required=False)\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        \n        # Set initial field requirements based on data\n        if self.data:\n            user_type = self.data.get('user_type')\n            self._update_field_requirements(user_type)\n    \n    def _update_field_requirements(self, user_type):\n        \"\"\"Update field requirements based on user type\"\"\"\n        \n        if user_type == 'individual':\n            self.fields['first_name'].required = True\n            self.fields['last_name'].required = True\n            self.fields['date_of_birth'].required = True\n            \n        elif user_type == 'business':\n            self.fields['company_name'].required = True\n            self.fields['tax_id'].required = True\n            self.fields['annual_revenue'].required = True\n            \n        elif user_type == 'nonprofit':\n            self.fields['organization_name'].required = True\n            self.fields['nonprofit_id'].required = True\n            self.fields['mission_statement'].required = True\n    \n    def clean(self):\n        cleaned_data = super().clean()\n        user_type = cleaned_data.get('user_type')\n        \n        # Apply type-specific validation\n        if user_type == 'individual':\n            self._validate_individual(cleaned_data)\n        elif user_type == 'business':\n            self._validate_business(cleaned_data)\n        elif user_type == 'nonprofit':\n            self._validate_nonprofit(cleaned_data)\n        \n        return cleaned_data\n    \n    def _validate_individual(self, data):\n        \"\"\"Validation specific to individual users\"\"\"\n        date_of_birth = data.get('date_of_birth')\n        \n        if date_of_birth:\n            from datetime import date\n            today = date.today()\n            age = today.year - date_of_birth.year - ((today.month, today.day) \u003C (date_of_birth.month, date_of_birth.day))\n            \n            if age \u003C 18:\n                raise ValidationError('Individual users must be at least 18 years old.')\n    \n    def _validate_business(self, data):\n        \"\"\"Validation specific to business users\"\"\"\n        tax_id = data.get('tax_id')\n        annual_revenue = data.get('annual_revenue')\n        \n        if tax_id:\n            # Validate tax ID format (simplified)\n            import re\n            if not re.match(r'^\\d{2}-\\d{7}$', tax_id):\n                raise ValidationError('Tax ID must be in format: XX-XXXXXXX')\n        \n        if annual_revenue and annual_revenue \u003C 0:\n            raise ValidationError('Annual revenue cannot be negative.')\n    \n    def _validate_nonprofit(self, data):\n        \"\"\"Validation specific to nonprofit organizations\"\"\"\n        nonprofit_id = data.get('nonprofit_id')\n        mission_statement = data.get('mission_statement')\n        \n        if nonprofit_id:\n            # Validate nonprofit ID format\n            if not nonprofit_id.startswith('NP'):\n                raise ValidationError('Non-profit ID must start with \"NP\".')\n        \n        if mission_statement and len(mission_statement) \u003C 50:\n            raise ValidationError('Mission statement must be at least 50 characters long.')\n",[1047,7092,7093,7098,7108,7112,7129,7138,7142,7151,7173,7195,7217,7221,7225,7249,7253,7258,7272,7294,7298,7303,7335,7366,7389,7393,7398,7430,7461,7501,7505,7510,7541,7572,7607,7611,7639,7662,7666,7671,7684,7712,7728,7732,7750,7759,7763,7780,7808,7833,7858,7862,7879,7904,7929,7954,7958,7974,7999,8024,8049,8053,8065,8079,8102,8106,8111,8127,8142,8158,8173,8189,8204,8208,8214,8218,8235,8244,8267,8271,8280,8291,8306,8374,8378,8391,8408,8412,8429,8438,8461,8484,8488,8497,8502,8509,8551,8568,8572,8589,8606,8610,8627,8636,8659,8682,8686,8695,8700,8724,8741,8745,8768],{"__ignoreMap":1045},[1050,7094,7095],{"class":1052,"line":1053},[1050,7096,7097],{"class":1056},"# forms.py - Dynamic validation based on form state\n",[1050,7099,7100,7102,7104,7106],{"class":1052,"line":1060},[1050,7101,1064],{"class":1063},[1050,7103,1068],{"class":1067},[1050,7105,1071],{"class":1063},[1050,7107,1074],{"class":1067},[1050,7109,7110],{"class":1052,"line":1077},[1050,7111,1106],{"emptyLinePlaceholder":1105},[1050,7113,7114,7116,7119,7121,7123,7125,7127],{"class":1052,"line":1102},[1050,7115,1113],{"class":1112},[1050,7117,7118],{"class":1116}," DynamicValidationForm",[1050,7120,1120],{"class":1085},[1050,7122,1124],{"class":1123},[1050,7124,1086],{"class":1085},[1050,7126,1129],{"class":1123},[1050,7128,1132],{"class":1085},[1050,7130,7131,7133,7136],{"class":1052,"line":1109},[1050,7132,1139],{"class":1138},[1050,7134,7135],{"class":1142},"Form with validation rules that change based on user input",[1050,7137,1146],{"class":1138},[1050,7139,7140],{"class":1052,"line":1135},[1050,7141,1152],{"class":1067},[1050,7143,7144,7147,7149],{"class":1052,"line":1149},[1050,7145,7146],{"class":1324},"    USER_TYPES",[1050,7148,4881],{"class":1085},[1050,7150,4884],{"class":1085},[1050,7152,7153,7155,7157,7160,7162,7164,7166,7169,7171],{"class":1052,"line":1155},[1050,7154,4889],{"class":1085},[1050,7156,1337],{"class":1336},[1050,7158,7159],{"class":1340},"individual",[1050,7161,1337],{"class":1336},[1050,7163,1704],{"class":1085},[1050,7165,1707],{"class":1336},[1050,7167,7168],{"class":1340},"Individual",[1050,7170,1337],{"class":1336},[1050,7172,3135],{"class":1085},[1050,7174,7175,7177,7179,7182,7184,7186,7188,7191,7193],{"class":1052,"line":1188},[1050,7176,4889],{"class":1085},[1050,7178,1337],{"class":1336},[1050,7180,7181],{"class":1340},"business",[1050,7183,1337],{"class":1336},[1050,7185,1704],{"class":1085},[1050,7187,1707],{"class":1336},[1050,7189,7190],{"class":1340},"Business",[1050,7192,1337],{"class":1336},[1050,7194,3135],{"class":1085},[1050,7196,7197,7199,7201,7204,7206,7208,7210,7213,7215],{"class":1052,"line":1206},[1050,7198,4889],{"class":1085},[1050,7200,1337],{"class":1336},[1050,7202,7203],{"class":1340},"nonprofit",[1050,7205,1337],{"class":1336},[1050,7207,1704],{"class":1085},[1050,7209,1707],{"class":1336},[1050,7211,7212],{"class":1340},"Non-Profit Organization",[1050,7214,1337],{"class":1336},[1050,7216,3135],{"class":1085},[1050,7218,7219],{"class":1052,"line":1237},[1050,7220,4978],{"class":1085},[1050,7222,7223],{"class":1052,"line":1265},[1050,7224,1152],{"class":1067},[1050,7226,7227,7230,7232,7234,7236,7238,7240,7242,7244,7247],{"class":1052,"line":1282},[1050,7228,7229],{"class":1067},"    user_type ",[1050,7231,1161],{"class":1085},[1050,7233,1164],{"class":1067},[1050,7235,1086],{"class":1085},[1050,7237,4996],{"class":1169},[1050,7239,1120],{"class":1085},[1050,7241,5001],{"class":1175},[1050,7243,1161],{"class":1085},[1050,7245,7246],{"class":5006},"USER_TYPES",[1050,7248,1185],{"class":1085},[1050,7250,7251],{"class":1052,"line":1287},[1050,7252,1152],{"class":1067},[1050,7254,7255],{"class":1052,"line":1305},[1050,7256,7257],{"class":1056},"    # Common fields\n",[1050,7259,7260,7262,7264,7266,7268,7270],{"class":1052,"line":1316},[1050,7261,1191],{"class":1067},[1050,7263,1161],{"class":1085},[1050,7265,1164],{"class":1067},[1050,7267,1086],{"class":1085},[1050,7269,1200],{"class":1169},[1050,7271,1203],{"class":1085},[1050,7273,7274,7276,7278,7280,7282,7284,7286,7288,7290,7292],{"class":1052,"line":1349},[1050,7275,2969],{"class":1067},[1050,7277,1161],{"class":1085},[1050,7279,1164],{"class":1067},[1050,7281,1086],{"class":1085},[1050,7283,1170],{"class":1169},[1050,7285,1120],{"class":1085},[1050,7287,1176],{"class":1175},[1050,7289,1161],{"class":1085},[1050,7291,2990],{"class":1181},[1050,7293,1185],{"class":1085},[1050,7295,7296],{"class":1052,"line":1355},[1050,7297,1152],{"class":1067},[1050,7299,7300],{"class":1052,"line":1384},[1050,7301,7302],{"class":1056},"    # Individual fields\n",[1050,7304,7305,7308,7310,7312,7314,7316,7318,7320,7322,7324,7326,7329,7331,7333],{"class":1052,"line":1389},[1050,7306,7307],{"class":1067},"    first_name ",[1050,7309,1161],{"class":1085},[1050,7311,1164],{"class":1067},[1050,7313,1086],{"class":1085},[1050,7315,1170],{"class":1169},[1050,7317,1120],{"class":1085},[1050,7319,1176],{"class":1175},[1050,7321,1161],{"class":1085},[1050,7323,1182],{"class":1181},[1050,7325,1704],{"class":1085},[1050,7327,7328],{"class":1175}," required",[1050,7330,1161],{"class":1085},[1050,7332,3453],{"class":2809},[1050,7334,1185],{"class":1085},[1050,7336,7337,7340,7342,7344,7346,7348,7350,7352,7354,7356,7358,7360,7362,7364],{"class":1052,"line":1395},[1050,7338,7339],{"class":1067},"    last_name ",[1050,7341,1161],{"class":1085},[1050,7343,1164],{"class":1067},[1050,7345,1086],{"class":1085},[1050,7347,1170],{"class":1169},[1050,7349,1120],{"class":1085},[1050,7351,1176],{"class":1175},[1050,7353,1161],{"class":1085},[1050,7355,1182],{"class":1181},[1050,7357,1704],{"class":1085},[1050,7359,7328],{"class":1175},[1050,7361,1161],{"class":1085},[1050,7363,3453],{"class":2809},[1050,7365,1185],{"class":1085},[1050,7367,7368,7371,7373,7375,7377,7379,7381,7383,7385,7387],{"class":1052,"line":1421},[1050,7369,7370],{"class":1067},"    date_of_birth ",[1050,7372,1161],{"class":1085},[1050,7374,1164],{"class":1067},[1050,7376,1086],{"class":1085},[1050,7378,4760],{"class":1169},[1050,7380,1120],{"class":1085},[1050,7382,5037],{"class":1175},[1050,7384,1161],{"class":1085},[1050,7386,3453],{"class":2809},[1050,7388,1185],{"class":1085},[1050,7390,7391],{"class":1052,"line":1441},[1050,7392,1152],{"class":1067},[1050,7394,7395],{"class":1052,"line":1446},[1050,7396,7397],{"class":1056},"    # Business fields\n",[1050,7399,7400,7403,7405,7407,7409,7411,7413,7415,7417,7420,7422,7424,7426,7428],{"class":1052,"line":1452},[1050,7401,7402],{"class":1067},"    company_name ",[1050,7404,1161],{"class":1085},[1050,7406,1164],{"class":1067},[1050,7408,1086],{"class":1085},[1050,7410,1170],{"class":1169},[1050,7412,1120],{"class":1085},[1050,7414,1176],{"class":1175},[1050,7416,1161],{"class":1085},[1050,7418,7419],{"class":1181},"100",[1050,7421,1704],{"class":1085},[1050,7423,7328],{"class":1175},[1050,7425,1161],{"class":1085},[1050,7427,3453],{"class":2809},[1050,7429,1185],{"class":1085},[1050,7431,7432,7435,7437,7439,7441,7443,7445,7447,7449,7451,7453,7455,7457,7459],{"class":1052,"line":1471},[1050,7433,7434],{"class":1067},"    tax_id ",[1050,7436,1161],{"class":1085},[1050,7438,1164],{"class":1067},[1050,7440,1086],{"class":1085},[1050,7442,1170],{"class":1169},[1050,7444,1120],{"class":1085},[1050,7446,1176],{"class":1175},[1050,7448,1161],{"class":1085},[1050,7450,3145],{"class":1181},[1050,7452,1704],{"class":1085},[1050,7454,7328],{"class":1175},[1050,7456,1161],{"class":1085},[1050,7458,3453],{"class":2809},[1050,7460,1185],{"class":1085},[1050,7462,7463,7466,7468,7470,7472,7474,7476,7478,7480,7483,7485,7487,7489,7491,7493,7495,7497,7499],{"class":1052,"line":1489},[1050,7464,7465],{"class":1067},"    annual_revenue ",[1050,7467,1161],{"class":1085},[1050,7469,1164],{"class":1067},[1050,7471,1086],{"class":1085},[1050,7473,3330],{"class":1169},[1050,7475,1120],{"class":1085},[1050,7477,4849],{"class":1175},[1050,7479,1161],{"class":1085},[1050,7481,7482],{"class":1181},"12",[1050,7484,1704],{"class":1085},[1050,7486,4858],{"class":1175},[1050,7488,1161],{"class":1085},[1050,7490,3354],{"class":1181},[1050,7492,1704],{"class":1085},[1050,7494,7328],{"class":1175},[1050,7496,1161],{"class":1085},[1050,7498,3453],{"class":2809},[1050,7500,1185],{"class":1085},[1050,7502,7503],{"class":1052,"line":1494},[1050,7504,1152],{"class":1067},[1050,7506,7507],{"class":1052,"line":1500},[1050,7508,7509],{"class":1056},"    # Non-profit fields\n",[1050,7511,7512,7515,7517,7519,7521,7523,7525,7527,7529,7531,7533,7535,7537,7539],{"class":1052,"line":1528},[1050,7513,7514],{"class":1067},"    organization_name ",[1050,7516,1161],{"class":1085},[1050,7518,1164],{"class":1067},[1050,7520,1086],{"class":1085},[1050,7522,1170],{"class":1169},[1050,7524,1120],{"class":1085},[1050,7526,1176],{"class":1175},[1050,7528,1161],{"class":1085},[1050,7530,7419],{"class":1181},[1050,7532,1704],{"class":1085},[1050,7534,7328],{"class":1175},[1050,7536,1161],{"class":1085},[1050,7538,3453],{"class":2809},[1050,7540,1185],{"class":1085},[1050,7542,7543,7546,7548,7550,7552,7554,7556,7558,7560,7562,7564,7566,7568,7570],{"class":1052,"line":1562},[1050,7544,7545],{"class":1067},"    nonprofit_id ",[1050,7547,1161],{"class":1085},[1050,7549,1164],{"class":1067},[1050,7551,1086],{"class":1085},[1050,7553,1170],{"class":1169},[1050,7555,1120],{"class":1085},[1050,7557,1176],{"class":1175},[1050,7559,1161],{"class":1085},[1050,7561,3145],{"class":1181},[1050,7563,1704],{"class":1085},[1050,7565,7328],{"class":1175},[1050,7567,1161],{"class":1085},[1050,7569,3453],{"class":2809},[1050,7571,1185],{"class":1085},[1050,7573,7574,7577,7579,7581,7583,7585,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605],{"class":1052,"line":1580},[1050,7575,7576],{"class":1067},"    mission_statement ",[1050,7578,1161],{"class":1085},[1050,7580,1164],{"class":1067},[1050,7582,1086],{"class":1085},[1050,7584,1170],{"class":1169},[1050,7586,1120],{"class":1085},[1050,7588,1222],{"class":1175},[1050,7590,1161],{"class":1085},[1050,7592,1124],{"class":1169},[1050,7594,1086],{"class":1085},[1050,7596,4569],{"class":1231},[1050,7598,1704],{"class":1085},[1050,7600,7328],{"class":1175},[1050,7602,1161],{"class":1085},[1050,7604,3453],{"class":2809},[1050,7606,1185],{"class":1085},[1050,7608,7609],{"class":1052,"line":1585},[1050,7610,1152],{"class":1067},[1050,7612,7613,7615,7618,7620,7622,7624,7626,7629,7631,7634,7637],{"class":1052,"line":1594},[1050,7614,1290],{"class":1112},[1050,7616,7617],{"class":1358}," __init__",[1050,7619,1120],{"class":1085},[1050,7621,1300],{"class":1299},[1050,7623,1704],{"class":1085},[1050,7625,3910],{"class":1411},[1050,7627,7628],{"class":3610},"args",[1050,7630,1704],{"class":1085},[1050,7632,7633],{"class":1411}," **",[1050,7635,7636],{"class":3610},"kwargs",[1050,7638,1132],{"class":1085},[1050,7640,7641,7643,7645,7648,7650,7652,7654,7656,7658,7660],{"class":1052,"line":1599},[1050,7642,2599],{"class":2300},[1050,7644,2304],{"class":1085},[1050,7646,7647],{"class":1358},"__init__",[1050,7649,1120],{"class":1085},[1050,7651,3974],{"class":1411},[1050,7653,7628],{"class":1169},[1050,7655,1704],{"class":1085},[1050,7657,7633],{"class":1411},[1050,7659,7636],{"class":1169},[1050,7661,1185],{"class":1085},[1050,7663,7664],{"class":1052,"line":1613},[1050,7665,1352],{"class":1067},[1050,7667,7668],{"class":1052,"line":1623},[1050,7669,7670],{"class":1056},"        # Set initial field requirements based on data\n",[1050,7672,7673,7675,7677,7679,7682],{"class":1052,"line":1648},[1050,7674,1398],{"class":1063},[1050,7676,1325],{"class":1324},[1050,7678,1086],{"class":1085},[1050,7680,7681],{"class":1231},"data",[1050,7683,1418],{"class":1085},[1050,7685,7686,7689,7691,7693,7695,7697,7699,7701,7703,7705,7708,7710],{"class":1052,"line":1653},[1050,7687,7688],{"class":1067},"            user_type ",[1050,7690,1161],{"class":1085},[1050,7692,1325],{"class":1324},[1050,7694,1086],{"class":1085},[1050,7696,7681],{"class":1231},[1050,7698,1086],{"class":1085},[1050,7700,2350],{"class":1169},[1050,7702,1120],{"class":1085},[1050,7704,1337],{"class":1336},[1050,7706,7707],{"class":1340},"user_type",[1050,7709,1337],{"class":1336},[1050,7711,1185],{"class":1085},[1050,7713,7714,7717,7719,7722,7724,7726],{"class":1052,"line":1675},[1050,7715,7716],{"class":1324},"            self",[1050,7718,1086],{"class":1085},[1050,7720,7721],{"class":1169},"_update_field_requirements",[1050,7723,1120],{"class":1085},[1050,7725,7707],{"class":1169},[1050,7727,1185],{"class":1085},[1050,7729,7730],{"class":1052,"line":1680},[1050,7731,1152],{"class":1067},[1050,7733,7734,7736,7739,7741,7743,7745,7748],{"class":1052,"line":1686},[1050,7735,1290],{"class":1112},[1050,7737,7738],{"class":1293}," _update_field_requirements",[1050,7740,1120],{"class":1085},[1050,7742,1300],{"class":1299},[1050,7744,1704],{"class":1085},[1050,7746,7747],{"class":3610}," user_type",[1050,7749,1132],{"class":1085},[1050,7751,7752,7754,7757],{"class":1052,"line":1726},[1050,7753,1308],{"class":1138},[1050,7755,7756],{"class":1142},"Update field requirements based on user type",[1050,7758,1146],{"class":1138},[1050,7760,7761],{"class":1052,"line":1759},[1050,7762,1352],{"class":1067},[1050,7764,7765,7767,7770,7772,7774,7776,7778],{"class":1052,"line":1778},[1050,7766,1398],{"class":1063},[1050,7768,7769],{"class":1067}," user_type ",[1050,7771,5746],{"class":1411},[1050,7773,1707],{"class":1336},[1050,7775,7159],{"class":1340},[1050,7777,1337],{"class":1336},[1050,7779,1418],{"class":1085},[1050,7781,7782,7784,7786,7789,7791,7793,7796,7798,7801,7803,7805],{"class":1052,"line":1804},[1050,7783,7716],{"class":1324},[1050,7785,1086],{"class":1085},[1050,7787,7788],{"class":1231},"fields",[1050,7790,1333],{"class":1085},[1050,7792,1337],{"class":1336},[1050,7794,7795],{"class":1340},"first_name",[1050,7797,1337],{"class":1336},[1050,7799,7800],{"class":1085},"].",[1050,7802,5037],{"class":1231},[1050,7804,4881],{"class":1085},[1050,7806,7807],{"class":2809}," True\n",[1050,7809,7810,7812,7814,7816,7818,7820,7823,7825,7827,7829,7831],{"class":1052,"line":1809},[1050,7811,7716],{"class":1324},[1050,7813,1086],{"class":1085},[1050,7815,7788],{"class":1231},[1050,7817,1333],{"class":1085},[1050,7819,1337],{"class":1336},[1050,7821,7822],{"class":1340},"last_name",[1050,7824,1337],{"class":1336},[1050,7826,7800],{"class":1085},[1050,7828,5037],{"class":1231},[1050,7830,4881],{"class":1085},[1050,7832,7807],{"class":2809},[1050,7834,7835,7837,7839,7841,7843,7845,7848,7850,7852,7854,7856],{"class":1052,"line":1817},[1050,7836,7716],{"class":1324},[1050,7838,1086],{"class":1085},[1050,7840,7788],{"class":1231},[1050,7842,1333],{"class":1085},[1050,7844,1337],{"class":1336},[1050,7846,7847],{"class":1340},"date_of_birth",[1050,7849,1337],{"class":1336},[1050,7851,7800],{"class":1085},[1050,7853,5037],{"class":1231},[1050,7855,4881],{"class":1085},[1050,7857,7807],{"class":2809},[1050,7859,7860],{"class":1052,"line":1822},[1050,7861,2764],{"class":1067},[1050,7863,7864,7867,7869,7871,7873,7875,7877],{"class":1052,"line":1836},[1050,7865,7866],{"class":1063},"        elif",[1050,7868,7769],{"class":1067},[1050,7870,5746],{"class":1411},[1050,7872,1707],{"class":1336},[1050,7874,7181],{"class":1340},[1050,7876,1337],{"class":1336},[1050,7878,1418],{"class":1085},[1050,7880,7881,7883,7885,7887,7889,7891,7894,7896,7898,7900,7902],{"class":1052,"line":1846},[1050,7882,7716],{"class":1324},[1050,7884,1086],{"class":1085},[1050,7886,7788],{"class":1231},[1050,7888,1333],{"class":1085},[1050,7890,1337],{"class":1336},[1050,7892,7893],{"class":1340},"company_name",[1050,7895,1337],{"class":1336},[1050,7897,7800],{"class":1085},[1050,7899,5037],{"class":1231},[1050,7901,4881],{"class":1085},[1050,7903,7807],{"class":2809},[1050,7905,7906,7908,7910,7912,7914,7916,7919,7921,7923,7925,7927],{"class":1052,"line":1871},[1050,7907,7716],{"class":1324},[1050,7909,1086],{"class":1085},[1050,7911,7788],{"class":1231},[1050,7913,1333],{"class":1085},[1050,7915,1337],{"class":1336},[1050,7917,7918],{"class":1340},"tax_id",[1050,7920,1337],{"class":1336},[1050,7922,7800],{"class":1085},[1050,7924,5037],{"class":1231},[1050,7926,4881],{"class":1085},[1050,7928,7807],{"class":2809},[1050,7930,7931,7933,7935,7937,7939,7941,7944,7946,7948,7950,7952],{"class":1052,"line":1876},[1050,7932,7716],{"class":1324},[1050,7934,1086],{"class":1085},[1050,7936,7788],{"class":1231},[1050,7938,1333],{"class":1085},[1050,7940,1337],{"class":1336},[1050,7942,7943],{"class":1340},"annual_revenue",[1050,7945,1337],{"class":1336},[1050,7947,7800],{"class":1085},[1050,7949,5037],{"class":1231},[1050,7951,4881],{"class":1085},[1050,7953,7807],{"class":2809},[1050,7955,7956],{"class":1052,"line":1890},[1050,7957,2764],{"class":1067},[1050,7959,7960,7962,7964,7966,7968,7970,7972],{"class":1052,"line":1895},[1050,7961,7866],{"class":1063},[1050,7963,7769],{"class":1067},[1050,7965,5746],{"class":1411},[1050,7967,1707],{"class":1336},[1050,7969,7203],{"class":1340},[1050,7971,1337],{"class":1336},[1050,7973,1418],{"class":1085},[1050,7975,7976,7978,7980,7982,7984,7986,7989,7991,7993,7995,7997],{"class":1052,"line":1901},[1050,7977,7716],{"class":1324},[1050,7979,1086],{"class":1085},[1050,7981,7788],{"class":1231},[1050,7983,1333],{"class":1085},[1050,7985,1337],{"class":1336},[1050,7987,7988],{"class":1340},"organization_name",[1050,7990,1337],{"class":1336},[1050,7992,7800],{"class":1085},[1050,7994,5037],{"class":1231},[1050,7996,4881],{"class":1085},[1050,7998,7807],{"class":2809},[1050,8000,8001,8003,8005,8007,8009,8011,8014,8016,8018,8020,8022],{"class":1052,"line":1921},[1050,8002,7716],{"class":1324},[1050,8004,1086],{"class":1085},[1050,8006,7788],{"class":1231},[1050,8008,1333],{"class":1085},[1050,8010,1337],{"class":1336},[1050,8012,8013],{"class":1340},"nonprofit_id",[1050,8015,1337],{"class":1336},[1050,8017,7800],{"class":1085},[1050,8019,5037],{"class":1231},[1050,8021,4881],{"class":1085},[1050,8023,7807],{"class":2809},[1050,8025,8026,8028,8030,8032,8034,8036,8039,8041,8043,8045,8047],{"class":1052,"line":1939},[1050,8027,7716],{"class":1324},[1050,8029,1086],{"class":1085},[1050,8031,7788],{"class":1231},[1050,8033,1333],{"class":1085},[1050,8035,1337],{"class":1336},[1050,8037,8038],{"class":1340},"mission_statement",[1050,8040,1337],{"class":1336},[1050,8042,7800],{"class":1085},[1050,8044,5037],{"class":1231},[1050,8046,4881],{"class":1085},[1050,8048,7807],{"class":2809},[1050,8050,8051],{"class":1052,"line":1944},[1050,8052,1152],{"class":1067},[1050,8054,8055,8057,8059,8061,8063],{"class":1052,"line":1950},[1050,8056,1290],{"class":1112},[1050,8058,2273],{"class":1293},[1050,8060,1120],{"class":1085},[1050,8062,1300],{"class":1299},[1050,8064,1132],{"class":1085},[1050,8066,8067,8069,8071,8073,8075,8077],{"class":1052,"line":1965},[1050,8068,2295],{"class":1067},[1050,8070,1161],{"class":1085},[1050,8072,2301],{"class":2300},[1050,8074,2304],{"class":1085},[1050,8076,2307],{"class":1169},[1050,8078,1203],{"class":1085},[1050,8080,8081,8084,8086,8088,8090,8092,8094,8096,8098,8100],{"class":1052,"line":1983},[1050,8082,8083],{"class":1067},"        user_type ",[1050,8085,1161],{"class":1085},[1050,8087,2345],{"class":1067},[1050,8089,1086],{"class":1085},[1050,8091,2350],{"class":1169},[1050,8093,1120],{"class":1085},[1050,8095,1337],{"class":1336},[1050,8097,7707],{"class":1340},[1050,8099,1337],{"class":1336},[1050,8101,1185],{"class":1085},[1050,8103,8104],{"class":1052,"line":1988},[1050,8105,1352],{"class":1067},[1050,8107,8108],{"class":1052,"line":1994},[1050,8109,8110],{"class":1056},"        # Apply type-specific validation\n",[1050,8112,8113,8115,8117,8119,8121,8123,8125],{"class":1052,"line":2039},[1050,8114,1398],{"class":1063},[1050,8116,7769],{"class":1067},[1050,8118,5746],{"class":1411},[1050,8120,1707],{"class":1336},[1050,8122,7159],{"class":1340},[1050,8124,1337],{"class":1336},[1050,8126,1418],{"class":1085},[1050,8128,8129,8131,8133,8136,8138,8140],{"class":1052,"line":2061},[1050,8130,7716],{"class":1324},[1050,8132,1086],{"class":1085},[1050,8134,8135],{"class":1169},"_validate_individual",[1050,8137,1120],{"class":1085},[1050,8139,1330],{"class":1169},[1050,8141,1185],{"class":1085},[1050,8143,8144,8146,8148,8150,8152,8154,8156],{"class":1052,"line":2079},[1050,8145,7866],{"class":1063},[1050,8147,7769],{"class":1067},[1050,8149,5746],{"class":1411},[1050,8151,1707],{"class":1336},[1050,8153,7181],{"class":1340},[1050,8155,1337],{"class":1336},[1050,8157,1418],{"class":1085},[1050,8159,8160,8162,8164,8167,8169,8171],{"class":1052,"line":2084},[1050,8161,7716],{"class":1324},[1050,8163,1086],{"class":1085},[1050,8165,8166],{"class":1169},"_validate_business",[1050,8168,1120],{"class":1085},[1050,8170,1330],{"class":1169},[1050,8172,1185],{"class":1085},[1050,8174,8175,8177,8179,8181,8183,8185,8187],{"class":1052,"line":2092},[1050,8176,7866],{"class":1063},[1050,8178,7769],{"class":1067},[1050,8180,5746],{"class":1411},[1050,8182,1707],{"class":1336},[1050,8184,7203],{"class":1340},[1050,8186,1337],{"class":1336},[1050,8188,1418],{"class":1085},[1050,8190,8191,8193,8195,8198,8200,8202],{"class":1052,"line":2097},[1050,8192,7716],{"class":1324},[1050,8194,1086],{"class":1085},[1050,8196,8197],{"class":1169},"_validate_nonprofit",[1050,8199,1120],{"class":1085},[1050,8201,1330],{"class":1169},[1050,8203,1185],{"class":1085},[1050,8205,8206],{"class":1052,"line":2111},[1050,8207,1352],{"class":1067},[1050,8209,8210,8212],{"class":1052,"line":2121},[1050,8211,1588],{"class":1063},[1050,8213,2548],{"class":1067},[1050,8215,8216],{"class":1052,"line":2146},[1050,8217,1152],{"class":1067},[1050,8219,8220,8222,8225,8227,8229,8231,8233],{"class":1052,"line":2151},[1050,8221,1290],{"class":1112},[1050,8223,8224],{"class":1293}," _validate_individual",[1050,8226,1120],{"class":1085},[1050,8228,1300],{"class":1299},[1050,8230,1704],{"class":1085},[1050,8232,5318],{"class":3610},[1050,8234,1132],{"class":1085},[1050,8236,8237,8239,8242],{"class":1052,"line":2173},[1050,8238,1308],{"class":1138},[1050,8240,8241],{"class":1142},"Validation specific to individual users",[1050,8243,1146],{"class":1138},[1050,8245,8246,8249,8251,8253,8255,8257,8259,8261,8263,8265],{"class":1052,"line":2178},[1050,8247,8248],{"class":1067},"        date_of_birth ",[1050,8250,1161],{"class":1085},[1050,8252,5318],{"class":1067},[1050,8254,1086],{"class":1085},[1050,8256,2350],{"class":1169},[1050,8258,1120],{"class":1085},[1050,8260,1337],{"class":1336},[1050,8262,7847],{"class":1340},[1050,8264,1337],{"class":1336},[1050,8266,1185],{"class":1085},[1050,8268,8269],{"class":1052,"line":2194},[1050,8270,1352],{"class":1067},[1050,8272,8273,8275,8278],{"class":1052,"line":2212},[1050,8274,1398],{"class":1063},[1050,8276,8277],{"class":1067}," date_of_birth",[1050,8279,1418],{"class":1085},[1050,8281,8282,8284,8286,8288],{"class":1052,"line":2217},[1050,8283,5790],{"class":1063},[1050,8285,4312],{"class":1067},[1050,8287,1071],{"class":1063},[1050,8289,8290],{"class":1067}," date\n",[1050,8292,8293,8296,8298,8300,8302,8304],{"class":1052,"line":2232},[1050,8294,8295],{"class":1067},"            today ",[1050,8297,1161],{"class":1085},[1050,8299,4678],{"class":1067},[1050,8301,1086],{"class":1085},[1050,8303,5455],{"class":1169},[1050,8305,1203],{"class":1085},[1050,8307,8308,8311,8313,8316,8318,8321,8324,8326,8328,8330,8332,8335,8337,8339,8342,8344,8346,8348,8351,8353,8355,8357,8359,8361,8363,8365,8367,8369,8371],{"class":1052,"line":2250},[1050,8309,8310],{"class":1067},"            age ",[1050,8312,1161],{"class":1085},[1050,8314,8315],{"class":1067}," today",[1050,8317,1086],{"class":1085},[1050,8319,8320],{"class":1231},"year",[1050,8322,8323],{"class":1411}," -",[1050,8325,8277],{"class":1067},[1050,8327,1086],{"class":1085},[1050,8329,8320],{"class":1231},[1050,8331,8323],{"class":1411},[1050,8333,8334],{"class":1085}," ((",[1050,8336,5455],{"class":1067},[1050,8338,1086],{"class":1085},[1050,8340,8341],{"class":1231},"month",[1050,8343,1704],{"class":1085},[1050,8345,8315],{"class":1067},[1050,8347,1086],{"class":1085},[1050,8349,8350],{"class":1231},"day",[1050,8352,1408],{"class":1085},[1050,8354,1412],{"class":1411},[1050,8356,3968],{"class":1085},[1050,8358,7847],{"class":1067},[1050,8360,1086],{"class":1085},[1050,8362,8341],{"class":1231},[1050,8364,1704],{"class":1085},[1050,8366,8277],{"class":1067},[1050,8368,1086],{"class":1085},[1050,8370,8350],{"class":1231},[1050,8372,8373],{"class":1085},"))\n",[1050,8375,8376],{"class":1052,"line":2255},[1050,8377,2764],{"class":1067},[1050,8379,8380,8382,8384,8386,8389],{"class":1052,"line":2263},[1050,8381,2441],{"class":1063},[1050,8383,2183],{"class":1067},[1050,8385,2186],{"class":1411},[1050,8387,8388],{"class":1181}," 18",[1050,8390,1418],{"class":1085},[1050,8392,8393,8395,8397,8399,8401,8404,8406],{"class":1052,"line":2268},[1050,8394,2456],{"class":1063},[1050,8396,1427],{"class":1169},[1050,8398,1120],{"class":1085},[1050,8400,1337],{"class":1336},[1050,8402,8403],{"class":1340},"Individual users must be at least 18 years old.",[1050,8405,1337],{"class":1336},[1050,8407,1185],{"class":1085},[1050,8409,8410],{"class":1052,"line":2282},[1050,8411,1152],{"class":1067},[1050,8413,8414,8416,8419,8421,8423,8425,8427],{"class":1052,"line":2292},[1050,8415,1290],{"class":1112},[1050,8417,8418],{"class":1293}," _validate_business",[1050,8420,1120],{"class":1085},[1050,8422,1300],{"class":1299},[1050,8424,1704],{"class":1085},[1050,8426,5318],{"class":3610},[1050,8428,1132],{"class":1085},[1050,8430,8431,8433,8436],{"class":1052,"line":2312},[1050,8432,1308],{"class":1138},[1050,8434,8435],{"class":1142},"Validation specific to business users",[1050,8437,1146],{"class":1138},[1050,8439,8440,8443,8445,8447,8449,8451,8453,8455,8457,8459],{"class":1052,"line":2317},[1050,8441,8442],{"class":1067},"        tax_id ",[1050,8444,1161],{"class":1085},[1050,8446,5318],{"class":1067},[1050,8448,1086],{"class":1085},[1050,8450,2350],{"class":1169},[1050,8452,1120],{"class":1085},[1050,8454,1337],{"class":1336},[1050,8456,7918],{"class":1340},[1050,8458,1337],{"class":1336},[1050,8460,1185],{"class":1085},[1050,8462,8463,8466,8468,8470,8472,8474,8476,8478,8480,8482],{"class":1052,"line":2333},[1050,8464,8465],{"class":1067},"        annual_revenue ",[1050,8467,1161],{"class":1085},[1050,8469,5318],{"class":1067},[1050,8471,1086],{"class":1085},[1050,8473,2350],{"class":1169},[1050,8475,1120],{"class":1085},[1050,8477,1337],{"class":1336},[1050,8479,7943],{"class":1340},[1050,8481,1337],{"class":1336},[1050,8483,1185],{"class":1085},[1050,8485,8486],{"class":1052,"line":2338},[1050,8487,1352],{"class":1067},[1050,8489,8490,8492,8495],{"class":1052,"line":2363},[1050,8491,1398],{"class":1063},[1050,8493,8494],{"class":1067}," tax_id",[1050,8496,1418],{"class":1085},[1050,8498,8499],{"class":1052,"line":2388},[1050,8500,8501],{"class":1056},"            # Validate tax ID format (simplified)\n",[1050,8503,8504,8507],{"class":1052,"line":2411},[1050,8505,8506],{"class":1063},"            import",[1050,8508,3593],{"class":1067},[1050,8510,8511,8513,8515,8517,8519,8522,8524,8526,8528,8531,8534,8536,8538,8541,8543,8545,8547,8549],{"class":1052,"line":2416},[1050,8512,2441],{"class":1063},[1050,8514,1457],{"class":1411},[1050,8516,3670],{"class":1067},[1050,8518,1086],{"class":1085},[1050,8520,8521],{"class":1169},"match",[1050,8523,1120],{"class":1085},[1050,8525,3017],{"class":1112},[1050,8527,1337],{"class":1336},[1050,8529,8530],{"class":3022},"^\\d",[1050,8532,8533],{"class":3030},"{2}",[1050,8535,5495],{"class":3034},[1050,8537,3039],{"class":3022},[1050,8539,8540],{"class":3030},"{7}",[1050,8542,3045],{"class":3022},[1050,8544,1337],{"class":1336},[1050,8546,1704],{"class":1085},[1050,8548,8494],{"class":1169},[1050,8550,1132],{"class":1085},[1050,8552,8553,8555,8557,8559,8561,8564,8566],{"class":1052,"line":2422},[1050,8554,2456],{"class":1063},[1050,8556,1427],{"class":1169},[1050,8558,1120],{"class":1085},[1050,8560,1337],{"class":1336},[1050,8562,8563],{"class":1340},"Tax ID must be in format: XX-XXXXXXX",[1050,8565,1337],{"class":1336},[1050,8567,1185],{"class":1085},[1050,8569,8570],{"class":1052,"line":2438},[1050,8571,1352],{"class":1067},[1050,8573,8574,8576,8579,8581,8583,8585,8587],{"class":1052,"line":2453},[1050,8575,1398],{"class":1063},[1050,8577,8578],{"class":1067}," annual_revenue ",[1050,8580,2430],{"class":1411},[1050,8582,8578],{"class":1067},[1050,8584,2186],{"class":1411},[1050,8586,4341],{"class":1181},[1050,8588,1418],{"class":1085},[1050,8590,8591,8593,8595,8597,8599,8602,8604],{"class":1052,"line":2472},[1050,8592,1424],{"class":1063},[1050,8594,1427],{"class":1169},[1050,8596,1120],{"class":1085},[1050,8598,1337],{"class":1336},[1050,8600,8601],{"class":1340},"Annual revenue cannot be negative.",[1050,8603,1337],{"class":1336},[1050,8605,1185],{"class":1085},[1050,8607,8608],{"class":1052,"line":2477},[1050,8609,1152],{"class":1067},[1050,8611,8612,8614,8617,8619,8621,8623,8625],{"class":1052,"line":2483},[1050,8613,1290],{"class":1112},[1050,8615,8616],{"class":1293}," _validate_nonprofit",[1050,8618,1120],{"class":1085},[1050,8620,1300],{"class":1299},[1050,8622,1704],{"class":1085},[1050,8624,5318],{"class":3610},[1050,8626,1132],{"class":1085},[1050,8628,8629,8631,8634],{"class":1052,"line":2497},[1050,8630,1308],{"class":1138},[1050,8632,8633],{"class":1142},"Validation specific to nonprofit organizations",[1050,8635,1146],{"class":1138},[1050,8637,8638,8641,8643,8645,8647,8649,8651,8653,8655,8657],{"class":1052,"line":2520},[1050,8639,8640],{"class":1067},"        nonprofit_id ",[1050,8642,1161],{"class":1085},[1050,8644,5318],{"class":1067},[1050,8646,1086],{"class":1085},[1050,8648,2350],{"class":1169},[1050,8650,1120],{"class":1085},[1050,8652,1337],{"class":1336},[1050,8654,8013],{"class":1340},[1050,8656,1337],{"class":1336},[1050,8658,1185],{"class":1085},[1050,8660,8661,8664,8666,8668,8670,8672,8674,8676,8678,8680],{"class":1052,"line":2538},[1050,8662,8663],{"class":1067},"        mission_statement ",[1050,8665,1161],{"class":1085},[1050,8667,5318],{"class":1067},[1050,8669,1086],{"class":1085},[1050,8671,2350],{"class":1169},[1050,8673,1120],{"class":1085},[1050,8675,1337],{"class":1336},[1050,8677,8038],{"class":1340},[1050,8679,1337],{"class":1336},[1050,8681,1185],{"class":1085},[1050,8683,8684],{"class":1052,"line":2543},[1050,8685,1352],{"class":1067},[1050,8687,8688,8690,8693],{"class":1052,"line":2551},[1050,8689,1398],{"class":1063},[1050,8691,8692],{"class":1067}," nonprofit_id",[1050,8694,1418],{"class":1085},[1050,8696,8697],{"class":1052,"line":2556},[1050,8698,8699],{"class":1056},"            # Validate nonprofit ID format\n",[1050,8701,8702,8704,8706,8708,8710,8713,8715,8717,8720,8722],{"class":1052,"line":2570},[1050,8703,2441],{"class":1063},[1050,8705,1457],{"class":1411},[1050,8707,8692],{"class":1067},[1050,8709,1086],{"class":1085},[1050,8711,8712],{"class":1169},"startswith",[1050,8714,1120],{"class":1085},[1050,8716,1337],{"class":1336},[1050,8718,8719],{"class":1340},"NP",[1050,8721,1337],{"class":1336},[1050,8723,1132],{"class":1085},[1050,8725,8726,8728,8730,8732,8734,8737,8739],{"class":1052,"line":2580},[1050,8727,2456],{"class":1063},[1050,8729,1427],{"class":1169},[1050,8731,1120],{"class":1085},[1050,8733,1337],{"class":1336},[1050,8735,8736],{"class":1340},"Non-profit ID must start with \"NP\".",[1050,8738,1337],{"class":1336},[1050,8740,1185],{"class":1085},[1050,8742,8743],{"class":1052,"line":2596},[1050,8744,1352],{"class":1067},[1050,8746,8747,8749,8752,8754,8756,8758,8760,8762,8764,8766],{"class":1052,"line":2609},[1050,8748,1398],{"class":1063},[1050,8750,8751],{"class":1067}," mission_statement ",[1050,8753,2430],{"class":1411},[1050,8755,1401],{"class":1358},[1050,8757,1120],{"class":1085},[1050,8759,8038],{"class":1169},[1050,8761,1408],{"class":1085},[1050,8763,1412],{"class":1411},[1050,8765,6069],{"class":1181},[1050,8767,1418],{"class":1085},[1050,8769,8770,8772,8774,8776,8778,8781,8783],{"class":1052,"line":2614},[1050,8771,1424],{"class":1063},[1050,8773,1427],{"class":1169},[1050,8775,1120],{"class":1085},[1050,8777,1337],{"class":1336},[1050,8779,8780],{"class":1340},"Mission statement must be at least 50 characters long.",[1050,8782,1337],{"class":1336},[1050,8784,1185],{"class":1085},[1030,8786,8788],{"id":8787},"validation-error-handling","Validation Error Handling",[1035,8790,8792],{"id":8791},"custom-error-messages-and-formatting","Custom Error Messages and Formatting",[1040,8794,8796],{"className":1042,"code":8795,"language":1044,"meta":1045,"style":1045},"# forms.py - Advanced error handling\nfrom django import forms\nfrom django.core.exceptions import ValidationError\n\nclass ErrorHandlingForm(forms.Form):\n    \"\"\"Form demonstrating advanced error handling techniques\"\"\"\n    \n    username = forms.CharField(max_length=30)\n    email = forms.EmailField()\n    password = forms.CharField(widget=forms.PasswordInput)\n    \n    # Custom error messages\n    error_messages = {\n        'username': {\n            'required': 'Please provide a username.',\n            'max_length': 'Username cannot exceed 30 characters.',\n        },\n        'email': {\n            'required': 'Email address is required.',\n            'invalid': 'Please enter a valid email address.',\n        },\n        'password': {\n            'required': 'Password is required.',\n        }\n    }\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        \n        # Apply custom error messages\n        for field_name, messages in self.error_messages.items():\n            if field_name in self.fields:\n                self.fields[field_name].error_messages.update(messages)\n    \n    def clean_username(self):\n        username = self.cleaned_data['username']\n        \n        # Multiple validation checks with specific error messages\n        errors = []\n        \n        if len(username) \u003C 3:\n            errors.append('Username must be at least 3 characters long.')\n        \n        if not username.isalnum():\n            errors.append('Username can only contain letters and numbers.')\n        \n        if username.lower() in ['admin', 'root', 'user']:\n            errors.append('This username is reserved and cannot be used.')\n        \n        # Check availability\n        from django.contrib.auth.models import User\n        if User.objects.filter(username=username).exists():\n            errors.append('This username is already taken.')\n        \n        if errors:\n            raise ValidationError(errors)\n        \n        return username\n    \n    def add_error(self, field, error):\n        \"\"\"Override to customize error handling\"\"\"\n        # Log validation errors\n        import logging\n        logger = logging.getLogger('form_validation')\n        logger.warning(f'Validation error in {self.__class__.__name__}.{field}: {error}')\n        \n        # Call parent method\n        super().add_error(field, error)\n    \n    def clean(self):\n        cleaned_data = super().clean()\n        \n        # Collect all validation errors\n        validation_errors = []\n        \n        username = cleaned_data.get('username')\n        password = cleaned_data.get('password')\n        \n        # Cross-field validation with detailed errors\n        if username and password:\n            if username.lower() in password.lower():\n                validation_errors.append(\n                    ValidationError(\n                        'Password cannot contain the username.',\n                        code='password_contains_username'\n                    )\n                )\n            \n            if len(password) \u003C 8:\n                validation_errors.append(\n                    ValidationError(\n                        'Password must be at least 8 characters long.',\n                        code='password_too_short'\n                    )\n                )\n        \n        if validation_errors:\n            raise ValidationError(validation_errors)\n        \n        return cleaned_data\n\n# Custom validation error class\nclass DetailedValidationError(ValidationError):\n    \"\"\"Enhanced validation error with additional context\"\"\"\n    \n    def __init__(self, message, code=None, params=None, field=None, suggestion=None):\n        super().__init__(message, code, params)\n        self.field = field\n        self.suggestion = suggestion\n\n# Usage in forms\nclass EnhancedForm(forms.Form):\n    email = forms.EmailField()\n    \n    def clean_email(self):\n        email = self.cleaned_data['email']\n        \n        if not email.endswith('@company.com'):\n            raise DetailedValidationError(\n                'Only company email addresses are allowed.',\n                code='invalid_domain',\n                field='email',\n                suggestion='Please use your @company.com email address.'\n            )\n        \n        return email\n",[1047,8797,8798,8803,8813,8831,8835,8852,8861,8865,8887,8901,8927,8931,8936,8945,8958,8978,8997,9002,9014,9033,9052,9056,9068,9087,9092,9097,9101,9125,9147,9151,9156,9185,9202,9231,9235,9247,9269,9273,9278,9288,9292,9310,9330,9334,9348,9367,9371,9415,9434,9438,9443,9465,9493,9511,9515,9524,9537,9541,9547,9551,9574,9583,9588,9596,9622,9679,9683,9688,9706,9710,9722,9736,9740,9745,9754,9758,9780,9802,9806,9811,9823,9845,9856,9863,9874,9888,9893,9897,9901,9919,9929,9935,9945,9958,9962,9966,9970,9979,9992,9996,10002,10006,10011,10025,10034,10038,10089,10111,10124,10138,10142,10147,10164,10178,10182,10194,10216,10220,10244,10252,10263,10279,10294,10308,10312,10316],{"__ignoreMap":1045},[1050,8799,8800],{"class":1052,"line":1053},[1050,8801,8802],{"class":1056},"# forms.py - Advanced error handling\n",[1050,8804,8805,8807,8809,8811],{"class":1052,"line":1060},[1050,8806,1064],{"class":1063},[1050,8808,1068],{"class":1067},[1050,8810,1071],{"class":1063},[1050,8812,1074],{"class":1067},[1050,8814,8815,8817,8819,8821,8823,8825,8827,8829],{"class":1052,"line":1077},[1050,8816,1064],{"class":1063},[1050,8818,1082],{"class":1067},[1050,8820,1086],{"class":1085},[1050,8822,1089],{"class":1067},[1050,8824,1086],{"class":1085},[1050,8826,1094],{"class":1067},[1050,8828,1071],{"class":1063},[1050,8830,1099],{"class":1067},[1050,8832,8833],{"class":1052,"line":1102},[1050,8834,1106],{"emptyLinePlaceholder":1105},[1050,8836,8837,8839,8842,8844,8846,8848,8850],{"class":1052,"line":1109},[1050,8838,1113],{"class":1112},[1050,8840,8841],{"class":1116}," ErrorHandlingForm",[1050,8843,1120],{"class":1085},[1050,8845,1124],{"class":1123},[1050,8847,1086],{"class":1085},[1050,8849,1129],{"class":1123},[1050,8851,1132],{"class":1085},[1050,8853,8854,8856,8859],{"class":1052,"line":1135},[1050,8855,1139],{"class":1138},[1050,8857,8858],{"class":1142},"Form demonstrating advanced error handling techniques",[1050,8860,1146],{"class":1138},[1050,8862,8863],{"class":1052,"line":1149},[1050,8864,1152],{"class":1067},[1050,8866,8867,8869,8871,8873,8875,8877,8879,8881,8883,8885],{"class":1052,"line":1155},[1050,8868,1158],{"class":1067},[1050,8870,1161],{"class":1085},[1050,8872,1164],{"class":1067},[1050,8874,1086],{"class":1085},[1050,8876,1170],{"class":1169},[1050,8878,1120],{"class":1085},[1050,8880,1176],{"class":1175},[1050,8882,1161],{"class":1085},[1050,8884,1182],{"class":1181},[1050,8886,1185],{"class":1085},[1050,8888,8889,8891,8893,8895,8897,8899],{"class":1052,"line":1188},[1050,8890,1191],{"class":1067},[1050,8892,1161],{"class":1085},[1050,8894,1164],{"class":1067},[1050,8896,1086],{"class":1085},[1050,8898,1200],{"class":1169},[1050,8900,1203],{"class":1085},[1050,8902,8903,8905,8907,8909,8911,8913,8915,8917,8919,8921,8923,8925],{"class":1052,"line":1206},[1050,8904,1209],{"class":1067},[1050,8906,1161],{"class":1085},[1050,8908,1164],{"class":1067},[1050,8910,1086],{"class":1085},[1050,8912,1170],{"class":1169},[1050,8914,1120],{"class":1085},[1050,8916,1222],{"class":1175},[1050,8918,1161],{"class":1085},[1050,8920,1124],{"class":1169},[1050,8922,1086],{"class":1085},[1050,8924,1232],{"class":1231},[1050,8926,1185],{"class":1085},[1050,8928,8929],{"class":1052,"line":1237},[1050,8930,1152],{"class":1067},[1050,8932,8933],{"class":1052,"line":1265},[1050,8934,8935],{"class":1056},"    # Custom error messages\n",[1050,8937,8938,8941,8943],{"class":1052,"line":1282},[1050,8939,8940],{"class":1067},"    error_messages ",[1050,8942,1161],{"class":1085},[1050,8944,6024],{"class":1085},[1050,8946,8947,8950,8952,8954,8956],{"class":1052,"line":1287},[1050,8948,8949],{"class":1336},"        '",[1050,8951,1341],{"class":1340},[1050,8953,1337],{"class":1336},[1050,8955,6036],{"class":1085},[1050,8957,6024],{"class":1085},[1050,8959,8960,8963,8965,8967,8969,8971,8974,8976],{"class":1052,"line":1305},[1050,8961,8962],{"class":1336},"            '",[1050,8964,5037],{"class":1340},[1050,8966,1337],{"class":1336},[1050,8968,6036],{"class":1085},[1050,8970,1707],{"class":1336},[1050,8972,8973],{"class":1340},"Please provide a username.",[1050,8975,1337],{"class":1336},[1050,8977,2887],{"class":1085},[1050,8979,8980,8982,8984,8986,8988,8990,8993,8995],{"class":1052,"line":1316},[1050,8981,8962],{"class":1336},[1050,8983,1176],{"class":1340},[1050,8985,1337],{"class":1336},[1050,8987,6036],{"class":1085},[1050,8989,1707],{"class":1336},[1050,8991,8992],{"class":1340},"Username cannot exceed 30 characters.",[1050,8994,1337],{"class":1336},[1050,8996,2887],{"class":1085},[1050,8998,8999],{"class":1052,"line":1349},[1050,9000,9001],{"class":1085},"        },\n",[1050,9003,9004,9006,9008,9010,9012],{"class":1052,"line":1355},[1050,9005,8949],{"class":1336},[1050,9007,1641],{"class":1340},[1050,9009,1337],{"class":1336},[1050,9011,6036],{"class":1085},[1050,9013,6024],{"class":1085},[1050,9015,9016,9018,9020,9022,9024,9026,9029,9031],{"class":1052,"line":1384},[1050,9017,8962],{"class":1336},[1050,9019,5037],{"class":1340},[1050,9021,1337],{"class":1336},[1050,9023,6036],{"class":1085},[1050,9025,1707],{"class":1336},[1050,9027,9028],{"class":1340},"Email address is required.",[1050,9030,1337],{"class":1336},[1050,9032,2887],{"class":1085},[1050,9034,9035,9037,9040,9042,9044,9046,9048,9050],{"class":1052,"line":1389},[1050,9036,8962],{"class":1336},[1050,9038,9039],{"class":1340},"invalid",[1050,9041,1337],{"class":1336},[1050,9043,6036],{"class":1085},[1050,9045,1707],{"class":1336},[1050,9047,3542],{"class":1340},[1050,9049,1337],{"class":1336},[1050,9051,2887],{"class":1085},[1050,9053,9054],{"class":1052,"line":1395},[1050,9055,9001],{"class":1085},[1050,9057,9058,9060,9062,9064,9066],{"class":1052,"line":1421},[1050,9059,8949],{"class":1336},[1050,9061,1864],{"class":1340},[1050,9063,1337],{"class":1336},[1050,9065,6036],{"class":1085},[1050,9067,6024],{"class":1085},[1050,9069,9070,9072,9074,9076,9078,9080,9083,9085],{"class":1052,"line":1441},[1050,9071,8962],{"class":1336},[1050,9073,5037],{"class":1340},[1050,9075,1337],{"class":1336},[1050,9077,6036],{"class":1085},[1050,9079,1707],{"class":1336},[1050,9081,9082],{"class":1340},"Password is required.",[1050,9084,1337],{"class":1336},[1050,9086,2887],{"class":1085},[1050,9088,9089],{"class":1052,"line":1446},[1050,9090,9091],{"class":1085},"        }\n",[1050,9093,9094],{"class":1052,"line":1452},[1050,9095,9096],{"class":1085},"    }\n",[1050,9098,9099],{"class":1052,"line":1471},[1050,9100,1152],{"class":1067},[1050,9102,9103,9105,9107,9109,9111,9113,9115,9117,9119,9121,9123],{"class":1052,"line":1489},[1050,9104,1290],{"class":1112},[1050,9106,7617],{"class":1358},[1050,9108,1120],{"class":1085},[1050,9110,1300],{"class":1299},[1050,9112,1704],{"class":1085},[1050,9114,3910],{"class":1411},[1050,9116,7628],{"class":3610},[1050,9118,1704],{"class":1085},[1050,9120,7633],{"class":1411},[1050,9122,7636],{"class":3610},[1050,9124,1132],{"class":1085},[1050,9126,9127,9129,9131,9133,9135,9137,9139,9141,9143,9145],{"class":1052,"line":1494},[1050,9128,2599],{"class":2300},[1050,9130,2304],{"class":1085},[1050,9132,7647],{"class":1358},[1050,9134,1120],{"class":1085},[1050,9136,3974],{"class":1411},[1050,9138,7628],{"class":1169},[1050,9140,1704],{"class":1085},[1050,9142,7633],{"class":1411},[1050,9144,7636],{"class":1169},[1050,9146,1185],{"class":1085},[1050,9148,9149],{"class":1052,"line":1500},[1050,9150,1352],{"class":1067},[1050,9152,9153],{"class":1052,"line":1528},[1050,9154,9155],{"class":1056},"        # Apply custom error messages\n",[1050,9157,9158,9161,9164,9166,9169,9171,9173,9175,9178,9180,9183],{"class":1052,"line":1562},[1050,9159,9160],{"class":1063},"        for",[1050,9162,9163],{"class":1067}," field_name",[1050,9165,1704],{"class":1085},[1050,9167,9168],{"class":1067}," messages ",[1050,9170,2789],{"class":1063},[1050,9172,1325],{"class":1324},[1050,9174,1086],{"class":1085},[1050,9176,9177],{"class":1231},"error_messages",[1050,9179,1086],{"class":1085},[1050,9181,9182],{"class":1169},"items",[1050,9184,1468],{"class":1085},[1050,9186,9187,9189,9192,9194,9196,9198,9200],{"class":1052,"line":1580},[1050,9188,2441],{"class":1063},[1050,9190,9191],{"class":1067}," field_name ",[1050,9193,2789],{"class":1411},[1050,9195,1325],{"class":1324},[1050,9197,1086],{"class":1085},[1050,9199,7788],{"class":1231},[1050,9201,1418],{"class":1085},[1050,9203,9204,9206,9208,9210,9212,9215,9217,9219,9221,9224,9226,9229],{"class":1052,"line":1585},[1050,9205,2799],{"class":1324},[1050,9207,1086],{"class":1085},[1050,9209,7788],{"class":1231},[1050,9211,1333],{"class":1085},[1050,9213,9214],{"class":1231},"field_name",[1050,9216,7800],{"class":1085},[1050,9218,9177],{"class":1231},[1050,9220,1086],{"class":1085},[1050,9222,9223],{"class":1169},"update",[1050,9225,1120],{"class":1085},[1050,9227,9228],{"class":1169},"messages",[1050,9230,1185],{"class":1085},[1050,9232,9233],{"class":1052,"line":1594},[1050,9234,1152],{"class":1067},[1050,9236,9237,9239,9241,9243,9245],{"class":1052,"line":1599},[1050,9238,1290],{"class":1112},[1050,9240,1294],{"class":1293},[1050,9242,1120],{"class":1085},[1050,9244,1300],{"class":1299},[1050,9246,1132],{"class":1085},[1050,9248,9249,9251,9253,9255,9257,9259,9261,9263,9265,9267],{"class":1052,"line":1613},[1050,9250,1319],{"class":1067},[1050,9252,1161],{"class":1085},[1050,9254,1325],{"class":1324},[1050,9256,1086],{"class":1085},[1050,9258,1330],{"class":1231},[1050,9260,1333],{"class":1085},[1050,9262,1337],{"class":1336},[1050,9264,1341],{"class":1340},[1050,9266,1337],{"class":1336},[1050,9268,1346],{"class":1085},[1050,9270,9271],{"class":1052,"line":1623},[1050,9272,1352],{"class":1067},[1050,9274,9275],{"class":1052,"line":1648},[1050,9276,9277],{"class":1056},"        # Multiple validation checks with specific error messages\n",[1050,9279,9280,9283,9285],{"class":1052,"line":1653},[1050,9281,9282],{"class":1067},"        errors ",[1050,9284,1161],{"class":1085},[1050,9286,9287],{"class":1085}," []\n",[1050,9289,9290],{"class":1052,"line":1675},[1050,9291,1352],{"class":1067},[1050,9293,9294,9296,9298,9300,9302,9304,9306,9308],{"class":1052,"line":1680},[1050,9295,1398],{"class":1063},[1050,9297,1401],{"class":1358},[1050,9299,1120],{"class":1085},[1050,9301,1341],{"class":1169},[1050,9303,1408],{"class":1085},[1050,9305,1412],{"class":1411},[1050,9307,1415],{"class":1181},[1050,9309,1418],{"class":1085},[1050,9311,9312,9315,9317,9320,9322,9324,9326,9328],{"class":1052,"line":1686},[1050,9313,9314],{"class":1067},"            errors",[1050,9316,1086],{"class":1085},[1050,9318,9319],{"class":1169},"append",[1050,9321,1120],{"class":1085},[1050,9323,1337],{"class":1336},[1050,9325,1434],{"class":1340},[1050,9327,1337],{"class":1336},[1050,9329,1185],{"class":1085},[1050,9331,9332],{"class":1052,"line":1726},[1050,9333,1352],{"class":1067},[1050,9335,9336,9338,9340,9342,9344,9346],{"class":1052,"line":1759},[1050,9337,1398],{"class":1063},[1050,9339,1457],{"class":1411},[1050,9341,1460],{"class":1067},[1050,9343,1086],{"class":1085},[1050,9345,1465],{"class":1169},[1050,9347,1468],{"class":1085},[1050,9349,9350,9352,9354,9356,9358,9360,9363,9365],{"class":1052,"line":1778},[1050,9351,9314],{"class":1067},[1050,9353,1086],{"class":1085},[1050,9355,9319],{"class":1169},[1050,9357,1120],{"class":1085},[1050,9359,1337],{"class":1336},[1050,9361,9362],{"class":1340},"Username can only contain letters and numbers.",[1050,9364,1337],{"class":1336},[1050,9366,1185],{"class":1085},[1050,9368,9369],{"class":1052,"line":1804},[1050,9370,1352],{"class":1067},[1050,9372,9373,9375,9377,9379,9381,9383,9385,9387,9389,9392,9394,9396,9398,9401,9403,9405,9407,9410,9412],{"class":1052,"line":1809},[1050,9374,1398],{"class":1063},[1050,9376,1460],{"class":1067},[1050,9378,1086],{"class":1085},[1050,9380,2048],{"class":1169},[1050,9382,2051],{"class":1085},[1050,9384,1770],{"class":1411},[1050,9386,1694],{"class":1085},[1050,9388,1337],{"class":1336},[1050,9390,9391],{"class":1340},"admin",[1050,9393,1337],{"class":1336},[1050,9395,1704],{"class":1085},[1050,9397,1707],{"class":1336},[1050,9399,9400],{"class":1340},"root",[1050,9402,1337],{"class":1336},[1050,9404,1704],{"class":1085},[1050,9406,1707],{"class":1336},[1050,9408,9409],{"class":1340},"user",[1050,9411,1337],{"class":1336},[1050,9413,9414],{"class":1085},"]:\n",[1050,9416,9417,9419,9421,9423,9425,9427,9430,9432],{"class":1052,"line":1817},[1050,9418,9314],{"class":1067},[1050,9420,1086],{"class":1085},[1050,9422,9319],{"class":1169},[1050,9424,1120],{"class":1085},[1050,9426,1337],{"class":1336},[1050,9428,9429],{"class":1340},"This username is reserved and cannot be used.",[1050,9431,1337],{"class":1336},[1050,9433,1185],{"class":1085},[1050,9435,9436],{"class":1052,"line":1822},[1050,9437,1352],{"class":1067},[1050,9439,9440],{"class":1052,"line":1836},[1050,9441,9442],{"class":1056},"        # Check availability\n",[1050,9444,9445,9447,9449,9451,9453,9455,9457,9459,9461,9463],{"class":1052,"line":1846},[1050,9446,1503],{"class":1063},[1050,9448,1082],{"class":1067},[1050,9450,1086],{"class":1085},[1050,9452,1510],{"class":1067},[1050,9454,1086],{"class":1085},[1050,9456,1515],{"class":1067},[1050,9458,1086],{"class":1085},[1050,9460,1520],{"class":1067},[1050,9462,1071],{"class":1063},[1050,9464,1525],{"class":1067},[1050,9466,9467,9469,9471,9473,9475,9477,9479,9481,9483,9485,9487,9489,9491],{"class":1052,"line":1871},[1050,9468,1398],{"class":1063},[1050,9470,1533],{"class":1067},[1050,9472,1086],{"class":1085},[1050,9474,1538],{"class":1231},[1050,9476,1086],{"class":1085},[1050,9478,1543],{"class":1169},[1050,9480,1120],{"class":1085},[1050,9482,1341],{"class":1175},[1050,9484,1161],{"class":1085},[1050,9486,1341],{"class":1169},[1050,9488,1554],{"class":1085},[1050,9490,1557],{"class":1169},[1050,9492,1468],{"class":1085},[1050,9494,9495,9497,9499,9501,9503,9505,9507,9509],{"class":1052,"line":1876},[1050,9496,9314],{"class":1067},[1050,9498,1086],{"class":1085},[1050,9500,9319],{"class":1169},[1050,9502,1120],{"class":1085},[1050,9504,1337],{"class":1336},[1050,9506,1573],{"class":1340},[1050,9508,1337],{"class":1336},[1050,9510,1185],{"class":1085},[1050,9512,9513],{"class":1052,"line":1890},[1050,9514,1352],{"class":1067},[1050,9516,9517,9519,9522],{"class":1052,"line":1895},[1050,9518,1398],{"class":1063},[1050,9520,9521],{"class":1067}," errors",[1050,9523,1418],{"class":1085},[1050,9525,9526,9528,9530,9532,9535],{"class":1052,"line":1901},[1050,9527,1424],{"class":1063},[1050,9529,1427],{"class":1169},[1050,9531,1120],{"class":1085},[1050,9533,9534],{"class":1169},"errors",[1050,9536,1185],{"class":1085},[1050,9538,9539],{"class":1052,"line":1921},[1050,9540,1352],{"class":1067},[1050,9542,9543,9545],{"class":1052,"line":1939},[1050,9544,1588],{"class":1063},[1050,9546,1591],{"class":1067},[1050,9548,9549],{"class":1052,"line":1944},[1050,9550,1152],{"class":1067},[1050,9552,9553,9555,9558,9560,9562,9564,9567,9569,9572],{"class":1052,"line":1950},[1050,9554,1290],{"class":1112},[1050,9556,9557],{"class":1293}," add_error",[1050,9559,1120],{"class":1085},[1050,9561,1300],{"class":1299},[1050,9563,1704],{"class":1085},[1050,9565,9566],{"class":3610}," field",[1050,9568,1704],{"class":1085},[1050,9570,9571],{"class":3610}," error",[1050,9573,1132],{"class":1085},[1050,9575,9576,9578,9581],{"class":1052,"line":1965},[1050,9577,1308],{"class":1138},[1050,9579,9580],{"class":1142},"Override to customize error handling",[1050,9582,1146],{"class":1138},[1050,9584,9585],{"class":1052,"line":1983},[1050,9586,9587],{"class":1056},"        # Log validation errors\n",[1050,9589,9590,9593],{"class":1052,"line":1988},[1050,9591,9592],{"class":1063},"        import",[1050,9594,9595],{"class":1067}," logging\n",[1050,9597,9598,9601,9603,9606,9608,9611,9613,9615,9618,9620],{"class":1052,"line":1994},[1050,9599,9600],{"class":1067},"        logger ",[1050,9602,1161],{"class":1085},[1050,9604,9605],{"class":1067}," logging",[1050,9607,1086],{"class":1085},[1050,9609,9610],{"class":1169},"getLogger",[1050,9612,1120],{"class":1085},[1050,9614,1337],{"class":1336},[1050,9616,9617],{"class":1340},"form_validation",[1050,9619,1337],{"class":1336},[1050,9621,1185],{"class":1085},[1050,9623,9624,9627,9629,9632,9634,9636,9639,9641,9643,9645,9649,9651,9654,9656,9658,9660,9663,9665,9668,9670,9673,9675,9677],{"class":1052,"line":2039},[1050,9625,9626],{"class":1067},"        logger",[1050,9628,1086],{"class":1085},[1050,9630,9631],{"class":1169},"warning",[1050,9633,1120],{"class":1085},[1050,9635,1364],{"class":1112},[1050,9637,9638],{"class":1340},"'Validation error in ",[1050,9640,1371],{"class":1370},[1050,9642,1300],{"class":1324},[1050,9644,1086],{"class":1085},[1050,9646,9648],{"class":9647},"s131V","__class__",[1050,9650,1086],{"class":1085},[1050,9652,9653],{"class":9647},"__name__",[1050,9655,1376],{"class":1370},[1050,9657,1086],{"class":1340},[1050,9659,1371],{"class":1370},[1050,9661,9662],{"class":1169},"field",[1050,9664,1376],{"class":1370},[1050,9666,9667],{"class":1340},": ",[1050,9669,1371],{"class":1370},[1050,9671,9672],{"class":1169},"error",[1050,9674,1376],{"class":1370},[1050,9676,1337],{"class":1340},[1050,9678,1185],{"class":1085},[1050,9680,9681],{"class":1052,"line":2061},[1050,9682,1352],{"class":1067},[1050,9684,9685],{"class":1052,"line":2079},[1050,9686,9687],{"class":1056},"        # Call parent method\n",[1050,9689,9690,9692,9694,9696,9698,9700,9702,9704],{"class":1052,"line":2084},[1050,9691,2599],{"class":2300},[1050,9693,2304],{"class":1085},[1050,9695,2804],{"class":1169},[1050,9697,1120],{"class":1085},[1050,9699,9662],{"class":1169},[1050,9701,1704],{"class":1085},[1050,9703,9571],{"class":1169},[1050,9705,1185],{"class":1085},[1050,9707,9708],{"class":1052,"line":2092},[1050,9709,1152],{"class":1067},[1050,9711,9712,9714,9716,9718,9720],{"class":1052,"line":2097},[1050,9713,1290],{"class":1112},[1050,9715,2273],{"class":1293},[1050,9717,1120],{"class":1085},[1050,9719,1300],{"class":1299},[1050,9721,1132],{"class":1085},[1050,9723,9724,9726,9728,9730,9732,9734],{"class":1052,"line":2111},[1050,9725,2295],{"class":1067},[1050,9727,1161],{"class":1085},[1050,9729,2301],{"class":2300},[1050,9731,2304],{"class":1085},[1050,9733,2307],{"class":1169},[1050,9735,1203],{"class":1085},[1050,9737,9738],{"class":1052,"line":2121},[1050,9739,1352],{"class":1067},[1050,9741,9742],{"class":1052,"line":2146},[1050,9743,9744],{"class":1056},"        # Collect all validation errors\n",[1050,9746,9747,9750,9752],{"class":1052,"line":2151},[1050,9748,9749],{"class":1067},"        validation_errors ",[1050,9751,1161],{"class":1085},[1050,9753,9287],{"class":1085},[1050,9755,9756],{"class":1052,"line":2173},[1050,9757,1352],{"class":1067},[1050,9759,9760,9762,9764,9766,9768,9770,9772,9774,9776,9778],{"class":1052,"line":2178},[1050,9761,1319],{"class":1067},[1050,9763,1161],{"class":1085},[1050,9765,2345],{"class":1067},[1050,9767,1086],{"class":1085},[1050,9769,2350],{"class":1169},[1050,9771,1120],{"class":1085},[1050,9773,1337],{"class":1336},[1050,9775,1341],{"class":1340},[1050,9777,1337],{"class":1336},[1050,9779,1185],{"class":1085},[1050,9781,9782,9784,9786,9788,9790,9792,9794,9796,9798,9800],{"class":1052,"line":2194},[1050,9783,1849],{"class":1067},[1050,9785,1161],{"class":1085},[1050,9787,2345],{"class":1067},[1050,9789,1086],{"class":1085},[1050,9791,2350],{"class":1169},[1050,9793,1120],{"class":1085},[1050,9795,1337],{"class":1336},[1050,9797,1864],{"class":1340},[1050,9799,1337],{"class":1336},[1050,9801,1185],{"class":1085},[1050,9803,9804],{"class":1052,"line":2212},[1050,9805,1352],{"class":1067},[1050,9807,9808],{"class":1052,"line":2217},[1050,9809,9810],{"class":1056},"        # Cross-field validation with detailed errors\n",[1050,9812,9813,9815,9817,9819,9821],{"class":1052,"line":2232},[1050,9814,1398],{"class":1063},[1050,9816,2488],{"class":1067},[1050,9818,2430],{"class":1411},[1050,9820,1955],{"class":1067},[1050,9822,1418],{"class":1085},[1050,9824,9825,9827,9829,9831,9833,9835,9837,9839,9841,9843],{"class":1052,"line":2250},[1050,9826,2441],{"class":1063},[1050,9828,1460],{"class":1067},[1050,9830,1086],{"class":1085},[1050,9832,2048],{"class":1169},[1050,9834,2051],{"class":1085},[1050,9836,1770],{"class":1411},[1050,9838,1955],{"class":1067},[1050,9840,1086],{"class":1085},[1050,9842,2048],{"class":1169},[1050,9844,1468],{"class":1085},[1050,9846,9847,9850,9852,9854],{"class":1052,"line":2255},[1050,9848,9849],{"class":1067},"                validation_errors",[1050,9851,1086],{"class":1085},[1050,9853,9319],{"class":1169},[1050,9855,2980],{"class":1085},[1050,9857,9858,9861],{"class":1052,"line":2263},[1050,9859,9860],{"class":1169},"                    ValidationError",[1050,9862,2980],{"class":1085},[1050,9864,9865,9868,9870,9872],{"class":1052,"line":2268},[1050,9866,9867],{"class":1336},"                        '",[1050,9869,2531],{"class":1340},[1050,9871,1337],{"class":1336},[1050,9873,2887],{"class":1085},[1050,9875,9876,9879,9881,9883,9886],{"class":1052,"line":2282},[1050,9877,9878],{"class":1175},"                        code",[1050,9880,1161],{"class":1085},[1050,9882,1337],{"class":1336},[1050,9884,9885],{"class":1340},"password_contains_username",[1050,9887,3064],{"class":1336},[1050,9889,9890],{"class":1052,"line":2292},[1050,9891,9892],{"class":1085},"                    )\n",[1050,9894,9895],{"class":1052,"line":2312},[1050,9896,6178],{"class":1085},[1050,9898,9899],{"class":1052,"line":2317},[1050,9900,2764],{"class":1067},[1050,9902,9903,9905,9907,9909,9911,9913,9915,9917],{"class":1052,"line":2333},[1050,9904,2441],{"class":1063},[1050,9906,1401],{"class":1358},[1050,9908,1120],{"class":1085},[1050,9910,1864],{"class":1169},[1050,9912,1408],{"class":1085},[1050,9914,1412],{"class":1411},[1050,9916,1916],{"class":1181},[1050,9918,1418],{"class":1085},[1050,9920,9921,9923,9925,9927],{"class":1052,"line":2338},[1050,9922,9849],{"class":1067},[1050,9924,1086],{"class":1085},[1050,9926,9319],{"class":1169},[1050,9928,2980],{"class":1085},[1050,9930,9931,9933],{"class":1052,"line":2363},[1050,9932,9860],{"class":1169},[1050,9934,2980],{"class":1085},[1050,9936,9937,9939,9941,9943],{"class":1052,"line":2388},[1050,9938,9867],{"class":1336},[1050,9940,1932],{"class":1340},[1050,9942,1337],{"class":1336},[1050,9944,2887],{"class":1085},[1050,9946,9947,9949,9951,9953,9956],{"class":1052,"line":2411},[1050,9948,9878],{"class":1175},[1050,9950,1161],{"class":1085},[1050,9952,1337],{"class":1336},[1050,9954,9955],{"class":1340},"password_too_short",[1050,9957,3064],{"class":1336},[1050,9959,9960],{"class":1052,"line":2416},[1050,9961,9892],{"class":1085},[1050,9963,9964],{"class":1052,"line":2422},[1050,9965,6178],{"class":1085},[1050,9967,9968],{"class":1052,"line":2438},[1050,9969,1352],{"class":1067},[1050,9971,9972,9974,9977],{"class":1052,"line":2453},[1050,9973,1398],{"class":1063},[1050,9975,9976],{"class":1067}," validation_errors",[1050,9978,1418],{"class":1085},[1050,9980,9981,9983,9985,9987,9990],{"class":1052,"line":2472},[1050,9982,1424],{"class":1063},[1050,9984,1427],{"class":1169},[1050,9986,1120],{"class":1085},[1050,9988,9989],{"class":1169},"validation_errors",[1050,9991,1185],{"class":1085},[1050,9993,9994],{"class":1052,"line":2477},[1050,9995,1352],{"class":1067},[1050,9997,9998,10000],{"class":1052,"line":2483},[1050,9999,1588],{"class":1063},[1050,10001,2548],{"class":1067},[1050,10003,10004],{"class":1052,"line":2497},[1050,10005,1106],{"emptyLinePlaceholder":1105},[1050,10007,10008],{"class":1052,"line":2520},[1050,10009,10010],{"class":1056},"# Custom validation error class\n",[1050,10012,10013,10015,10018,10020,10023],{"class":1052,"line":2538},[1050,10014,1113],{"class":1112},[1050,10016,10017],{"class":1116}," DetailedValidationError",[1050,10019,1120],{"class":1085},[1050,10021,10022],{"class":1123},"ValidationError",[1050,10024,1132],{"class":1085},[1050,10026,10027,10029,10032],{"class":1052,"line":2543},[1050,10028,1139],{"class":1138},[1050,10030,10031],{"class":1142},"Enhanced validation error with additional context",[1050,10033,1146],{"class":1138},[1050,10035,10036],{"class":1052,"line":2551},[1050,10037,1152],{"class":1067},[1050,10039,10040,10042,10044,10046,10048,10050,10052,10054,10057,10059,10061,10063,10066,10068,10070,10072,10074,10076,10078,10080,10083,10085,10087],{"class":1052,"line":2556},[1050,10041,1290],{"class":1112},[1050,10043,7617],{"class":1358},[1050,10045,1120],{"class":1085},[1050,10047,1300],{"class":1299},[1050,10049,1704],{"class":1085},[1050,10051,3123],{"class":3610},[1050,10053,1704],{"class":1085},[1050,10055,10056],{"class":3610}," code",[1050,10058,1161],{"class":1411},[1050,10060,2810],{"class":2809},[1050,10062,1704],{"class":1085},[1050,10064,10065],{"class":3610}," params",[1050,10067,1161],{"class":1411},[1050,10069,2810],{"class":2809},[1050,10071,1704],{"class":1085},[1050,10073,9566],{"class":3610},[1050,10075,1161],{"class":1411},[1050,10077,2810],{"class":2809},[1050,10079,1704],{"class":1085},[1050,10081,10082],{"class":3610}," suggestion",[1050,10084,1161],{"class":1411},[1050,10086,2810],{"class":2809},[1050,10088,1132],{"class":1085},[1050,10090,10091,10093,10095,10097,10099,10101,10103,10105,10107,10109],{"class":1052,"line":2570},[1050,10092,2599],{"class":2300},[1050,10094,2304],{"class":1085},[1050,10096,7647],{"class":1358},[1050,10098,1120],{"class":1085},[1050,10100,3535],{"class":1169},[1050,10102,1704],{"class":1085},[1050,10104,10056],{"class":1169},[1050,10106,1704],{"class":1085},[1050,10108,10065],{"class":1169},[1050,10110,1185],{"class":1085},[1050,10112,10113,10115,10117,10119,10121],{"class":1052,"line":2580},[1050,10114,2623],{"class":1324},[1050,10116,1086],{"class":1085},[1050,10118,9662],{"class":1231},[1050,10120,4881],{"class":1085},[1050,10122,10123],{"class":1067}," field\n",[1050,10125,10126,10128,10130,10133,10135],{"class":1052,"line":2596},[1050,10127,2623],{"class":1324},[1050,10129,1086],{"class":1085},[1050,10131,10132],{"class":1231},"suggestion",[1050,10134,4881],{"class":1085},[1050,10136,10137],{"class":1067}," suggestion\n",[1050,10139,10140],{"class":1052,"line":2609},[1050,10141,1106],{"emptyLinePlaceholder":1105},[1050,10143,10144],{"class":1052,"line":2614},[1050,10145,10146],{"class":1056},"# Usage in forms\n",[1050,10148,10149,10151,10154,10156,10158,10160,10162],{"class":1052,"line":2620},[1050,10150,1113],{"class":1112},[1050,10152,10153],{"class":1116}," EnhancedForm",[1050,10155,1120],{"class":1085},[1050,10157,1124],{"class":1123},[1050,10159,1086],{"class":1085},[1050,10161,1129],{"class":1123},[1050,10163,1132],{"class":1085},[1050,10165,10166,10168,10170,10172,10174,10176],{"class":1052,"line":2633},[1050,10167,1191],{"class":1067},[1050,10169,1161],{"class":1085},[1050,10171,1164],{"class":1067},[1050,10173,1086],{"class":1085},[1050,10175,1200],{"class":1169},[1050,10177,1203],{"class":1085},[1050,10179,10180],{"class":1052,"line":2638},[1050,10181,1152],{"class":1067},[1050,10183,10184,10186,10188,10190,10192],{"class":1052,"line":2652},[1050,10185,1290],{"class":1112},[1050,10187,1604],{"class":1293},[1050,10189,1120],{"class":1085},[1050,10191,1300],{"class":1299},[1050,10193,1132],{"class":1085},[1050,10195,10196,10198,10200,10202,10204,10206,10208,10210,10212,10214],{"class":1052,"line":2662},[1050,10197,1626],{"class":1067},[1050,10199,1161],{"class":1085},[1050,10201,1325],{"class":1324},[1050,10203,1086],{"class":1085},[1050,10205,1330],{"class":1231},[1050,10207,1333],{"class":1085},[1050,10209,1337],{"class":1336},[1050,10211,1641],{"class":1340},[1050,10213,1337],{"class":1336},[1050,10215,1346],{"class":1085},[1050,10217,10218],{"class":1052,"line":2678},[1050,10219,1352],{"class":1067},[1050,10221,10222,10224,10226,10228,10230,10233,10235,10237,10240,10242],{"class":1052,"line":2683},[1050,10223,1398],{"class":1063},[1050,10225,1457],{"class":1411},[1050,10227,1734],{"class":1067},[1050,10229,1086],{"class":1085},[1050,10231,10232],{"class":1169},"endswith",[1050,10234,1120],{"class":1085},[1050,10236,1337],{"class":1336},[1050,10238,10239],{"class":1340},"@company.com",[1050,10241,1337],{"class":1336},[1050,10243,1132],{"class":1085},[1050,10245,10246,10248,10250],{"class":1052,"line":2705},[1050,10247,1424],{"class":1063},[1050,10249,10017],{"class":1169},[1050,10251,2980],{"class":1085},[1050,10253,10254,10256,10259,10261],{"class":1052,"line":2733},[1050,10255,6029],{"class":1336},[1050,10257,10258],{"class":1340},"Only company email addresses are allowed.",[1050,10260,1337],{"class":1336},[1050,10262,2887],{"class":1085},[1050,10264,10265,10268,10270,10272,10275,10277],{"class":1052,"line":2761},[1050,10266,10267],{"class":1175},"                code",[1050,10269,1161],{"class":1085},[1050,10271,1337],{"class":1336},[1050,10273,10274],{"class":1340},"invalid_domain",[1050,10276,1337],{"class":1336},[1050,10278,2887],{"class":1085},[1050,10280,10281,10284,10286,10288,10290,10292],{"class":1052,"line":2767},[1050,10282,10283],{"class":1175},"                field",[1050,10285,1161],{"class":1085},[1050,10287,1337],{"class":1336},[1050,10289,1641],{"class":1340},[1050,10291,1337],{"class":1336},[1050,10293,2887],{"class":1085},[1050,10295,10296,10299,10301,10303,10306],{"class":1052,"line":2773},[1050,10297,10298],{"class":1175},"                suggestion",[1050,10300,1161],{"class":1085},[1050,10302,1337],{"class":1336},[1050,10304,10305],{"class":1340},"Please use your @company.com email address.",[1050,10307,3064],{"class":1336},[1050,10309,10310],{"class":1052,"line":2796},[1050,10311,3069],{"class":1085},[1050,10313,10314],{"class":1052,"line":6330},[1050,10315,1352],{"class":1067},[1050,10317,10318,10320],{"class":1052,"line":6359},[1050,10319,1588],{"class":1063},[1050,10321,1814],{"class":1067},[1030,10323,10325],{"id":10324},"async-validation","Async Validation",[1035,10327,10329],{"id":10328},"asynchronous-field-validation","Asynchronous Field Validation",[1040,10331,10333],{"className":1042,"code":10332,"language":1044,"meta":1045,"style":1045},"# forms.py - Async validation patterns\nfrom django import forms\nimport asyncio\nimport aiohttp\n\nclass AsyncValidationForm(forms.Form):\n    \"\"\"Form with asynchronous validation\"\"\"\n    \n    username = forms.CharField(max_length=30)\n    email = forms.EmailField()\n    domain = forms.CharField(max_length=100)\n    \n    async def clean_username_async(self):\n        \"\"\"Async username validation\"\"\"\n        username = self.cleaned_data['username']\n        \n        # Simulate API call to check username availability\n        async with aiohttp.ClientSession() as session:\n            async with session.get(f'https://api.example.com/check-username/{username}') as response:\n                if response.status == 200:\n                    data = await response.json()\n                    if not data.get('available', True):\n                        raise ValidationError('Username is not available.')\n        \n        return username\n    \n    async def clean_email_async(self):\n        \"\"\"Async email validation\"\"\"\n        email = self.cleaned_data['email']\n        \n        # Validate email with external service\n        async with aiohttp.ClientSession() as session:\n            async with session.post('https://api.emailvalidation.com/validate', \n                                  json={'email': email}) as response:\n                if response.status == 200:\n                    data = await response.json()\n                    if not data.get('valid', False):\n                        raise ValidationError('Email address is not valid.')\n        \n        return email\n    \n    async def clean_domain_async(self):\n        \"\"\"Async domain validation\"\"\"\n        domain = self.cleaned_data['domain']\n        \n        # Check if domain exists\n        try:\n            import socket\n            socket.gethostbyname(domain)\n        except socket.gaierror:\n            raise ValidationError('Domain does not exist.')\n        \n        return domain\n    \n    async def full_clean_async(self):\n        \"\"\"Async version of full_clean\"\"\"\n        # Run regular validation first\n        super().full_clean()\n        \n        if not self.errors:\n            # Run async validations\n            tasks = []\n            \n            if 'username' in self.cleaned_data:\n                tasks.append(self.clean_username_async())\n            \n            if 'email' in self.cleaned_data:\n                tasks.append(self.clean_email_async())\n            \n            if 'domain' in self.cleaned_data:\n                tasks.append(self.clean_domain_async())\n            \n            try:\n                await asyncio.gather(*tasks)\n            except ValidationError as e:\n                self.add_error(None, e)\n\n# views.py - Handling async validation\nimport asyncio\nfrom django.http import JsonResponse\n\nasync def async_form_view(request):\n    if request.method == 'POST':\n        form = AsyncValidationForm(request.POST)\n        \n        # Run async validation\n        await form.full_clean_async()\n        \n        if form.is_valid():\n            # Process form\n            return JsonResponse({'success': True})\n        else:\n            return JsonResponse({'errors': form.errors}, status=400)\n    \n    return render(request, 'async_form.html', {'form': AsyncValidationForm()})\n",[1047,10334,10335,10340,10350,10357,10364,10368,10385,10394,10398,10420,10434,10457,10461,10478,10487,10509,10513,10518,10544,10581,10600,10619,10648,10666,10670,10676,10680,10695,10704,10726,10730,10735,10755,10782,10809,10825,10841,10868,10885,10889,10895,10899,10914,10923,10945,10949,10954,10961,10968,10984,10999,11016,11020,11027,11031,11046,11055,11060,11070,11074,11088,11093,11102,11106,11126,11147,11151,11171,11190,11194,11214,11233,11237,11244,11266,11282,11300,11304,11309,11315,11331,11335,11352,11375,11395,11399,11404,11419,11423,11436,11441,11466,11473,11508,11512],{"__ignoreMap":1045},[1050,10336,10337],{"class":1052,"line":1053},[1050,10338,10339],{"class":1056},"# forms.py - Async validation patterns\n",[1050,10341,10342,10344,10346,10348],{"class":1052,"line":1060},[1050,10343,1064],{"class":1063},[1050,10345,1068],{"class":1067},[1050,10347,1071],{"class":1063},[1050,10349,1074],{"class":1067},[1050,10351,10352,10354],{"class":1052,"line":1077},[1050,10353,1071],{"class":1063},[1050,10355,10356],{"class":1067}," asyncio\n",[1050,10358,10359,10361],{"class":1052,"line":1102},[1050,10360,1071],{"class":1063},[1050,10362,10363],{"class":1067}," aiohttp\n",[1050,10365,10366],{"class":1052,"line":1109},[1050,10367,1106],{"emptyLinePlaceholder":1105},[1050,10369,10370,10372,10375,10377,10379,10381,10383],{"class":1052,"line":1135},[1050,10371,1113],{"class":1112},[1050,10373,10374],{"class":1116}," AsyncValidationForm",[1050,10376,1120],{"class":1085},[1050,10378,1124],{"class":1123},[1050,10380,1086],{"class":1085},[1050,10382,1129],{"class":1123},[1050,10384,1132],{"class":1085},[1050,10386,10387,10389,10392],{"class":1052,"line":1149},[1050,10388,1139],{"class":1138},[1050,10390,10391],{"class":1142},"Form with asynchronous validation",[1050,10393,1146],{"class":1138},[1050,10395,10396],{"class":1052,"line":1155},[1050,10397,1152],{"class":1067},[1050,10399,10400,10402,10404,10406,10408,10410,10412,10414,10416,10418],{"class":1052,"line":1188},[1050,10401,1158],{"class":1067},[1050,10403,1161],{"class":1085},[1050,10405,1164],{"class":1067},[1050,10407,1086],{"class":1085},[1050,10409,1170],{"class":1169},[1050,10411,1120],{"class":1085},[1050,10413,1176],{"class":1175},[1050,10415,1161],{"class":1085},[1050,10417,1182],{"class":1181},[1050,10419,1185],{"class":1085},[1050,10421,10422,10424,10426,10428,10430,10432],{"class":1052,"line":1206},[1050,10423,1191],{"class":1067},[1050,10425,1161],{"class":1085},[1050,10427,1164],{"class":1067},[1050,10429,1086],{"class":1085},[1050,10431,1200],{"class":1169},[1050,10433,1203],{"class":1085},[1050,10435,10436,10439,10441,10443,10445,10447,10449,10451,10453,10455],{"class":1052,"line":1237},[1050,10437,10438],{"class":1067},"    domain ",[1050,10440,1161],{"class":1085},[1050,10442,1164],{"class":1067},[1050,10444,1086],{"class":1085},[1050,10446,1170],{"class":1169},[1050,10448,1120],{"class":1085},[1050,10450,1176],{"class":1175},[1050,10452,1161],{"class":1085},[1050,10454,7419],{"class":1181},[1050,10456,1185],{"class":1085},[1050,10458,10459],{"class":1052,"line":1265},[1050,10460,1152],{"class":1067},[1050,10462,10463,10466,10469,10472,10474,10476],{"class":1052,"line":1282},[1050,10464,10465],{"class":1112},"    async",[1050,10467,10468],{"class":1112}," def",[1050,10470,10471],{"class":1293}," clean_username_async",[1050,10473,1120],{"class":1085},[1050,10475,1300],{"class":1299},[1050,10477,1132],{"class":1085},[1050,10479,10480,10482,10485],{"class":1052,"line":1287},[1050,10481,1308],{"class":1138},[1050,10483,10484],{"class":1142},"Async username validation",[1050,10486,1146],{"class":1138},[1050,10488,10489,10491,10493,10495,10497,10499,10501,10503,10505,10507],{"class":1052,"line":1305},[1050,10490,1319],{"class":1067},[1050,10492,1161],{"class":1085},[1050,10494,1325],{"class":1324},[1050,10496,1086],{"class":1085},[1050,10498,1330],{"class":1231},[1050,10500,1333],{"class":1085},[1050,10502,1337],{"class":1336},[1050,10504,1341],{"class":1340},[1050,10506,1337],{"class":1336},[1050,10508,1346],{"class":1085},[1050,10510,10511],{"class":1052,"line":1316},[1050,10512,1352],{"class":1067},[1050,10514,10515],{"class":1052,"line":1349},[1050,10516,10517],{"class":1056},"        # Simulate API call to check username availability\n",[1050,10519,10520,10523,10526,10529,10531,10534,10536,10539,10542],{"class":1052,"line":1355},[1050,10521,10522],{"class":1063},"        async",[1050,10524,10525],{"class":1063}," with",[1050,10527,10528],{"class":1067}," aiohttp",[1050,10530,1086],{"class":1085},[1050,10532,10533],{"class":1169},"ClientSession",[1050,10535,2051],{"class":1085},[1050,10537,10538],{"class":1063}," as",[1050,10540,10541],{"class":1067}," session",[1050,10543,1418],{"class":1085},[1050,10545,10546,10549,10551,10553,10555,10557,10559,10561,10564,10566,10568,10570,10572,10574,10576,10579],{"class":1052,"line":1384},[1050,10547,10548],{"class":1063},"            async",[1050,10550,10525],{"class":1063},[1050,10552,10541],{"class":1067},[1050,10554,1086],{"class":1085},[1050,10556,2350],{"class":1169},[1050,10558,1120],{"class":1085},[1050,10560,1364],{"class":1112},[1050,10562,10563],{"class":1340},"'https://api.example.com/check-username/",[1050,10565,1371],{"class":1370},[1050,10567,1341],{"class":1169},[1050,10569,1376],{"class":1370},[1050,10571,1337],{"class":1340},[1050,10573,1408],{"class":1085},[1050,10575,10538],{"class":1063},[1050,10577,10578],{"class":1067}," response",[1050,10580,1418],{"class":1085},[1050,10582,10583,10586,10588,10590,10593,10596,10598],{"class":1052,"line":1389},[1050,10584,10585],{"class":1063},"                if",[1050,10587,10578],{"class":1067},[1050,10589,1086],{"class":1085},[1050,10591,10592],{"class":1231},"status",[1050,10594,10595],{"class":1411}," ==",[1050,10597,6492],{"class":1181},[1050,10599,1418],{"class":1085},[1050,10601,10602,10605,10607,10610,10612,10614,10617],{"class":1052,"line":1395},[1050,10603,10604],{"class":1067},"                    data ",[1050,10606,1161],{"class":1085},[1050,10608,10609],{"class":1063}," await",[1050,10611,10578],{"class":1067},[1050,10613,1086],{"class":1085},[1050,10615,10616],{"class":1169},"json",[1050,10618,1203],{"class":1085},[1050,10620,10621,10624,10626,10628,10630,10632,10634,10636,10639,10641,10643,10646],{"class":1052,"line":1421},[1050,10622,10623],{"class":1063},"                    if",[1050,10625,1457],{"class":1411},[1050,10627,5318],{"class":1067},[1050,10629,1086],{"class":1085},[1050,10631,2350],{"class":1169},[1050,10633,1120],{"class":1085},[1050,10635,1337],{"class":1336},[1050,10637,10638],{"class":1340},"available",[1050,10640,1337],{"class":1336},[1050,10642,1704],{"class":1085},[1050,10644,10645],{"class":2809}," True",[1050,10647,1132],{"class":1085},[1050,10649,10650,10653,10655,10657,10659,10662,10664],{"class":1052,"line":1441},[1050,10651,10652],{"class":1063},"                        raise",[1050,10654,1427],{"class":1169},[1050,10656,1120],{"class":1085},[1050,10658,1337],{"class":1336},[1050,10660,10661],{"class":1340},"Username is not available.",[1050,10663,1337],{"class":1336},[1050,10665,1185],{"class":1085},[1050,10667,10668],{"class":1052,"line":1446},[1050,10669,1352],{"class":1067},[1050,10671,10672,10674],{"class":1052,"line":1452},[1050,10673,1588],{"class":1063},[1050,10675,1591],{"class":1067},[1050,10677,10678],{"class":1052,"line":1471},[1050,10679,1152],{"class":1067},[1050,10681,10682,10684,10686,10689,10691,10693],{"class":1052,"line":1489},[1050,10683,10465],{"class":1112},[1050,10685,10468],{"class":1112},[1050,10687,10688],{"class":1293}," clean_email_async",[1050,10690,1120],{"class":1085},[1050,10692,1300],{"class":1299},[1050,10694,1132],{"class":1085},[1050,10696,10697,10699,10702],{"class":1052,"line":1494},[1050,10698,1308],{"class":1138},[1050,10700,10701],{"class":1142},"Async email validation",[1050,10703,1146],{"class":1138},[1050,10705,10706,10708,10710,10712,10714,10716,10718,10720,10722,10724],{"class":1052,"line":1500},[1050,10707,1626],{"class":1067},[1050,10709,1161],{"class":1085},[1050,10711,1325],{"class":1324},[1050,10713,1086],{"class":1085},[1050,10715,1330],{"class":1231},[1050,10717,1333],{"class":1085},[1050,10719,1337],{"class":1336},[1050,10721,1641],{"class":1340},[1050,10723,1337],{"class":1336},[1050,10725,1346],{"class":1085},[1050,10727,10728],{"class":1052,"line":1528},[1050,10729,1352],{"class":1067},[1050,10731,10732],{"class":1052,"line":1562},[1050,10733,10734],{"class":1056},"        # Validate email with external service\n",[1050,10736,10737,10739,10741,10743,10745,10747,10749,10751,10753],{"class":1052,"line":1580},[1050,10738,10522],{"class":1063},[1050,10740,10525],{"class":1063},[1050,10742,10528],{"class":1067},[1050,10744,1086],{"class":1085},[1050,10746,10533],{"class":1169},[1050,10748,2051],{"class":1085},[1050,10750,10538],{"class":1063},[1050,10752,10541],{"class":1067},[1050,10754,1418],{"class":1085},[1050,10756,10757,10759,10761,10763,10765,10768,10770,10772,10775,10777,10779],{"class":1052,"line":1585},[1050,10758,10548],{"class":1063},[1050,10760,10525],{"class":1063},[1050,10762,10541],{"class":1067},[1050,10764,1086],{"class":1085},[1050,10766,10767],{"class":1169},"post",[1050,10769,1120],{"class":1085},[1050,10771,1337],{"class":1336},[1050,10773,10774],{"class":1340},"https://api.emailvalidation.com/validate",[1050,10776,1337],{"class":1336},[1050,10778,1704],{"class":1085},[1050,10780,10781],{"class":1169}," \n",[1050,10783,10784,10787,10790,10792,10794,10796,10798,10800,10803,10805,10807],{"class":1052,"line":1594},[1050,10785,10786],{"class":1175},"                                  json",[1050,10788,10789],{"class":1085},"={",[1050,10791,1337],{"class":1336},[1050,10793,1641],{"class":1340},[1050,10795,1337],{"class":1336},[1050,10797,6036],{"class":1085},[1050,10799,1734],{"class":1169},[1050,10801,10802],{"class":1085},"})",[1050,10804,10538],{"class":1063},[1050,10806,10578],{"class":1067},[1050,10808,1418],{"class":1085},[1050,10810,10811,10813,10815,10817,10819,10821,10823],{"class":1052,"line":1599},[1050,10812,10585],{"class":1063},[1050,10814,10578],{"class":1067},[1050,10816,1086],{"class":1085},[1050,10818,10592],{"class":1231},[1050,10820,10595],{"class":1411},[1050,10822,6492],{"class":1181},[1050,10824,1418],{"class":1085},[1050,10826,10827,10829,10831,10833,10835,10837,10839],{"class":1052,"line":1613},[1050,10828,10604],{"class":1067},[1050,10830,1161],{"class":1085},[1050,10832,10609],{"class":1063},[1050,10834,10578],{"class":1067},[1050,10836,1086],{"class":1085},[1050,10838,10616],{"class":1169},[1050,10840,1203],{"class":1085},[1050,10842,10843,10845,10847,10849,10851,10853,10855,10857,10860,10862,10864,10866],{"class":1052,"line":1623},[1050,10844,10623],{"class":1063},[1050,10846,1457],{"class":1411},[1050,10848,5318],{"class":1067},[1050,10850,1086],{"class":1085},[1050,10852,2350],{"class":1169},[1050,10854,1120],{"class":1085},[1050,10856,1337],{"class":1336},[1050,10858,10859],{"class":1340},"valid",[1050,10861,1337],{"class":1336},[1050,10863,1704],{"class":1085},[1050,10865,6325],{"class":2809},[1050,10867,1132],{"class":1085},[1050,10869,10870,10872,10874,10876,10878,10881,10883],{"class":1052,"line":1648},[1050,10871,10652],{"class":1063},[1050,10873,1427],{"class":1169},[1050,10875,1120],{"class":1085},[1050,10877,1337],{"class":1336},[1050,10879,10880],{"class":1340},"Email address is not valid.",[1050,10882,1337],{"class":1336},[1050,10884,1185],{"class":1085},[1050,10886,10887],{"class":1052,"line":1653},[1050,10888,1352],{"class":1067},[1050,10890,10891,10893],{"class":1052,"line":1675},[1050,10892,1588],{"class":1063},[1050,10894,1814],{"class":1067},[1050,10896,10897],{"class":1052,"line":1680},[1050,10898,1152],{"class":1067},[1050,10900,10901,10903,10905,10908,10910,10912],{"class":1052,"line":1686},[1050,10902,10465],{"class":1112},[1050,10904,10468],{"class":1112},[1050,10906,10907],{"class":1293}," clean_domain_async",[1050,10909,1120],{"class":1085},[1050,10911,1300],{"class":1299},[1050,10913,1132],{"class":1085},[1050,10915,10916,10918,10921],{"class":1052,"line":1726},[1050,10917,1308],{"class":1138},[1050,10919,10920],{"class":1142},"Async domain validation",[1050,10922,1146],{"class":1138},[1050,10924,10925,10927,10929,10931,10933,10935,10937,10939,10941,10943],{"class":1052,"line":1759},[1050,10926,1729],{"class":1067},[1050,10928,1161],{"class":1085},[1050,10930,1325],{"class":1324},[1050,10932,1086],{"class":1085},[1050,10934,1330],{"class":1231},[1050,10936,1333],{"class":1085},[1050,10938,1337],{"class":1336},[1050,10940,1794],{"class":1340},[1050,10942,1337],{"class":1336},[1050,10944,1346],{"class":1085},[1050,10946,10947],{"class":1052,"line":1778},[1050,10948,1352],{"class":1067},[1050,10950,10951],{"class":1052,"line":1804},[1050,10952,10953],{"class":1056},"        # Check if domain exists\n",[1050,10955,10956,10959],{"class":1052,"line":1809},[1050,10957,10958],{"class":1063},"        try",[1050,10960,1418],{"class":1085},[1050,10962,10963,10965],{"class":1052,"line":1817},[1050,10964,8506],{"class":1063},[1050,10966,10967],{"class":1067}," socket\n",[1050,10969,10970,10973,10975,10978,10980,10982],{"class":1052,"line":1822},[1050,10971,10972],{"class":1067},"            socket",[1050,10974,1086],{"class":1085},[1050,10976,10977],{"class":1169},"gethostbyname",[1050,10979,1120],{"class":1085},[1050,10981,1794],{"class":1169},[1050,10983,1185],{"class":1085},[1050,10985,10986,10989,10992,10994,10997],{"class":1052,"line":1836},[1050,10987,10988],{"class":1063},"        except",[1050,10990,10991],{"class":1067}," socket",[1050,10993,1086],{"class":1085},[1050,10995,10996],{"class":1231},"gaierror",[1050,10998,1418],{"class":1085},[1050,11000,11001,11003,11005,11007,11009,11012,11014],{"class":1052,"line":1846},[1050,11002,1424],{"class":1063},[1050,11004,1427],{"class":1169},[1050,11006,1120],{"class":1085},[1050,11008,1337],{"class":1336},[1050,11010,11011],{"class":1340},"Domain does not exist.",[1050,11013,1337],{"class":1336},[1050,11015,1185],{"class":1085},[1050,11017,11018],{"class":1052,"line":1871},[1050,11019,1352],{"class":1067},[1050,11021,11022,11024],{"class":1052,"line":1876},[1050,11023,1588],{"class":1063},[1050,11025,11026],{"class":1067}," domain\n",[1050,11028,11029],{"class":1052,"line":1890},[1050,11030,1152],{"class":1067},[1050,11032,11033,11035,11037,11040,11042,11044],{"class":1052,"line":1895},[1050,11034,10465],{"class":1112},[1050,11036,10468],{"class":1112},[1050,11038,11039],{"class":1293}," full_clean_async",[1050,11041,1120],{"class":1085},[1050,11043,1300],{"class":1299},[1050,11045,1132],{"class":1085},[1050,11047,11048,11050,11053],{"class":1052,"line":1901},[1050,11049,1308],{"class":1138},[1050,11051,11052],{"class":1142},"Async version of full_clean",[1050,11054,1146],{"class":1138},[1050,11056,11057],{"class":1052,"line":1921},[1050,11058,11059],{"class":1056},"        # Run regular validation first\n",[1050,11061,11062,11064,11066,11068],{"class":1052,"line":1939},[1050,11063,2599],{"class":2300},[1050,11065,2304],{"class":1085},[1050,11067,2604],{"class":1169},[1050,11069,1203],{"class":1085},[1050,11071,11072],{"class":1052,"line":1944},[1050,11073,1352],{"class":1067},[1050,11075,11076,11078,11080,11082,11084,11086],{"class":1052,"line":1950},[1050,11077,1398],{"class":1063},[1050,11079,1457],{"class":1411},[1050,11081,1325],{"class":1324},[1050,11083,1086],{"class":1085},[1050,11085,9534],{"class":1231},[1050,11087,1418],{"class":1085},[1050,11089,11090],{"class":1052,"line":1965},[1050,11091,11092],{"class":1056},"            # Run async validations\n",[1050,11094,11095,11098,11100],{"class":1052,"line":1983},[1050,11096,11097],{"class":1067},"            tasks ",[1050,11099,1161],{"class":1085},[1050,11101,9287],{"class":1085},[1050,11103,11104],{"class":1052,"line":1988},[1050,11105,2764],{"class":1067},[1050,11107,11108,11110,11112,11114,11116,11118,11120,11122,11124],{"class":1052,"line":1994},[1050,11109,2441],{"class":1063},[1050,11111,1707],{"class":1336},[1050,11113,1341],{"class":1340},[1050,11115,1337],{"class":1336},[1050,11117,1770],{"class":1411},[1050,11119,1325],{"class":1324},[1050,11121,1086],{"class":1085},[1050,11123,1330],{"class":1231},[1050,11125,1418],{"class":1085},[1050,11127,11128,11131,11133,11135,11137,11139,11141,11144],{"class":1052,"line":2039},[1050,11129,11130],{"class":1067},"                tasks",[1050,11132,1086],{"class":1085},[1050,11134,9319],{"class":1169},[1050,11136,1120],{"class":1085},[1050,11138,1300],{"class":1324},[1050,11140,1086],{"class":1085},[1050,11142,11143],{"class":1169},"clean_username_async",[1050,11145,11146],{"class":1085},"())\n",[1050,11148,11149],{"class":1052,"line":2061},[1050,11150,2764],{"class":1067},[1050,11152,11153,11155,11157,11159,11161,11163,11165,11167,11169],{"class":1052,"line":2079},[1050,11154,2441],{"class":1063},[1050,11156,1707],{"class":1336},[1050,11158,1641],{"class":1340},[1050,11160,1337],{"class":1336},[1050,11162,1770],{"class":1411},[1050,11164,1325],{"class":1324},[1050,11166,1086],{"class":1085},[1050,11168,1330],{"class":1231},[1050,11170,1418],{"class":1085},[1050,11172,11173,11175,11177,11179,11181,11183,11185,11188],{"class":1052,"line":2084},[1050,11174,11130],{"class":1067},[1050,11176,1086],{"class":1085},[1050,11178,9319],{"class":1169},[1050,11180,1120],{"class":1085},[1050,11182,1300],{"class":1324},[1050,11184,1086],{"class":1085},[1050,11186,11187],{"class":1169},"clean_email_async",[1050,11189,11146],{"class":1085},[1050,11191,11192],{"class":1052,"line":2092},[1050,11193,2764],{"class":1067},[1050,11195,11196,11198,11200,11202,11204,11206,11208,11210,11212],{"class":1052,"line":2097},[1050,11197,2441],{"class":1063},[1050,11199,1707],{"class":1336},[1050,11201,1794],{"class":1340},[1050,11203,1337],{"class":1336},[1050,11205,1770],{"class":1411},[1050,11207,1325],{"class":1324},[1050,11209,1086],{"class":1085},[1050,11211,1330],{"class":1231},[1050,11213,1418],{"class":1085},[1050,11215,11216,11218,11220,11222,11224,11226,11228,11231],{"class":1052,"line":2111},[1050,11217,11130],{"class":1067},[1050,11219,1086],{"class":1085},[1050,11221,9319],{"class":1169},[1050,11223,1120],{"class":1085},[1050,11225,1300],{"class":1324},[1050,11227,1086],{"class":1085},[1050,11229,11230],{"class":1169},"clean_domain_async",[1050,11232,11146],{"class":1085},[1050,11234,11235],{"class":1052,"line":2121},[1050,11236,2764],{"class":1067},[1050,11238,11239,11242],{"class":1052,"line":2146},[1050,11240,11241],{"class":1063},"            try",[1050,11243,1418],{"class":1085},[1050,11245,11246,11249,11252,11254,11257,11259,11261,11264],{"class":1052,"line":2151},[1050,11247,11248],{"class":1063},"                await",[1050,11250,11251],{"class":1067}," asyncio",[1050,11253,1086],{"class":1085},[1050,11255,11256],{"class":1169},"gather",[1050,11258,1120],{"class":1085},[1050,11260,3974],{"class":1411},[1050,11262,11263],{"class":1169},"tasks",[1050,11265,1185],{"class":1085},[1050,11267,11268,11271,11274,11277,11280],{"class":1052,"line":2173},[1050,11269,11270],{"class":1063},"            except",[1050,11272,11273],{"class":1067}," ValidationError ",[1050,11275,11276],{"class":1063},"as",[1050,11278,11279],{"class":1067}," e",[1050,11281,1418],{"class":1085},[1050,11283,11284,11286,11288,11290,11292,11294,11296,11298],{"class":1052,"line":2178},[1050,11285,2799],{"class":1324},[1050,11287,1086],{"class":1085},[1050,11289,2804],{"class":1169},[1050,11291,1120],{"class":1085},[1050,11293,2810],{"class":2809},[1050,11295,1704],{"class":1085},[1050,11297,11279],{"class":1169},[1050,11299,1185],{"class":1085},[1050,11301,11302],{"class":1052,"line":2194},[1050,11303,1106],{"emptyLinePlaceholder":1105},[1050,11305,11306],{"class":1052,"line":2212},[1050,11307,11308],{"class":1056},"# views.py - Handling async validation\n",[1050,11310,11311,11313],{"class":1052,"line":2217},[1050,11312,1071],{"class":1063},[1050,11314,10356],{"class":1067},[1050,11316,11317,11319,11321,11323,11326,11328],{"class":1052,"line":2232},[1050,11318,1064],{"class":1063},[1050,11320,1082],{"class":1067},[1050,11322,1086],{"class":1085},[1050,11324,11325],{"class":1067},"http ",[1050,11327,1071],{"class":1063},[1050,11329,11330],{"class":1067}," JsonResponse\n",[1050,11332,11333],{"class":1052,"line":2250},[1050,11334,1106],{"emptyLinePlaceholder":1105},[1050,11336,11337,11340,11342,11345,11347,11350],{"class":1052,"line":2255},[1050,11338,11339],{"class":1112},"async",[1050,11341,10468],{"class":1112},[1050,11343,11344],{"class":1293}," async_form_view",[1050,11346,1120],{"class":1085},[1050,11348,11349],{"class":3610},"request",[1050,11351,1132],{"class":1085},[1050,11353,11354,11356,11359,11361,11364,11366,11368,11371,11373],{"class":1052,"line":2263},[1050,11355,3626],{"class":1063},[1050,11357,11358],{"class":1067}," request",[1050,11360,1086],{"class":1085},[1050,11362,11363],{"class":1231},"method",[1050,11365,10595],{"class":1411},[1050,11367,1707],{"class":1336},[1050,11369,11370],{"class":1340},"POST",[1050,11372,1337],{"class":1336},[1050,11374,1418],{"class":1085},[1050,11376,11377,11380,11382,11384,11386,11388,11390,11393],{"class":1052,"line":2268},[1050,11378,11379],{"class":1067},"        form ",[1050,11381,1161],{"class":1085},[1050,11383,10374],{"class":1169},[1050,11385,1120],{"class":1085},[1050,11387,11349],{"class":1169},[1050,11389,1086],{"class":1085},[1050,11391,11370],{"class":11392},"sFGJz",[1050,11394,1185],{"class":1085},[1050,11396,11397],{"class":1052,"line":2282},[1050,11398,1352],{"class":1067},[1050,11400,11401],{"class":1052,"line":2292},[1050,11402,11403],{"class":1056},"        # Run async validation\n",[1050,11405,11406,11409,11412,11414,11417],{"class":1052,"line":2312},[1050,11407,11408],{"class":1063},"        await",[1050,11410,11411],{"class":1067}," form",[1050,11413,1086],{"class":1085},[1050,11415,11416],{"class":1169},"full_clean_async",[1050,11418,1203],{"class":1085},[1050,11420,11421],{"class":1052,"line":2317},[1050,11422,1352],{"class":1067},[1050,11424,11425,11427,11429,11431,11434],{"class":1052,"line":2333},[1050,11426,1398],{"class":1063},[1050,11428,11411],{"class":1067},[1050,11430,1086],{"class":1085},[1050,11432,11433],{"class":1169},"is_valid",[1050,11435,1468],{"class":1085},[1050,11437,11438],{"class":1052,"line":2338},[1050,11439,11440],{"class":1056},"            # Process form\n",[1050,11442,11443,11446,11449,11452,11454,11457,11459,11461,11463],{"class":1052,"line":2363},[1050,11444,11445],{"class":1063},"            return",[1050,11447,11448],{"class":1169}," JsonResponse",[1050,11450,11451],{"class":1085},"({",[1050,11453,1337],{"class":1336},[1050,11455,11456],{"class":1340},"success",[1050,11458,1337],{"class":1336},[1050,11460,6036],{"class":1085},[1050,11462,10645],{"class":2809},[1050,11464,11465],{"class":1085},"})\n",[1050,11467,11468,11471],{"class":1052,"line":2388},[1050,11469,11470],{"class":1063},"        else",[1050,11472,1418],{"class":1085},[1050,11474,11475,11477,11479,11481,11483,11485,11487,11489,11491,11493,11495,11498,11501,11503,11506],{"class":1052,"line":2411},[1050,11476,11445],{"class":1063},[1050,11478,11448],{"class":1169},[1050,11480,11451],{"class":1085},[1050,11482,1337],{"class":1336},[1050,11484,9534],{"class":1340},[1050,11486,1337],{"class":1336},[1050,11488,6036],{"class":1085},[1050,11490,11411],{"class":1169},[1050,11492,1086],{"class":1085},[1050,11494,9534],{"class":1231},[1050,11496,11497],{"class":1085},"},",[1050,11499,11500],{"class":1175}," status",[1050,11502,1161],{"class":1085},[1050,11504,11505],{"class":1181},"400",[1050,11507,1185],{"class":1085},[1050,11509,11510],{"class":1052,"line":2416},[1050,11511,1152],{"class":1067},[1050,11513,11514,11517,11520,11522,11524,11526,11528,11531,11533,11535,11538,11540,11543,11545,11547,11549],{"class":1052,"line":2422},[1050,11515,11516],{"class":1063},"    return",[1050,11518,11519],{"class":1169}," render",[1050,11521,1120],{"class":1085},[1050,11523,11349],{"class":1169},[1050,11525,1704],{"class":1085},[1050,11527,1707],{"class":1336},[1050,11529,11530],{"class":1340},"async_form.html",[1050,11532,1337],{"class":1336},[1050,11534,1704],{"class":1085},[1050,11536,11537],{"class":1085}," {",[1050,11539,1337],{"class":1336},[1050,11541,11542],{"class":1340},"form",[1050,11544,1337],{"class":1336},[1050,11546,6036],{"class":1085},[1050,11548,10374],{"class":1169},[1050,11550,11551],{"class":1085},"()})\n",[1026,11553,11554],{},"Django's validation system provides comprehensive tools for ensuring data integrity at multiple levels. By understanding field-level validation, form-level cross-validation, dynamic validation rules, and advanced error handling techniques, you can build robust forms that provide clear feedback and maintain data quality while handling complex business requirements.",[11556,11557,11558],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sk0MF, html code.shiki .sk0MF{--shiki-light:#90A4AE;--shiki-default:#BDA437;--shiki-dark:#E6CC77}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .sETVe, html code.shiki .sETVe{--shiki-light:#39ADB5;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1045,"searchDepth":1053,"depth":1060,"links":11560},[11561,11564,11568,11571,11574,11577],{"id":1032,"depth":1060,"text":1033,"children":11562},[11563],{"id":1037,"depth":1077,"text":1038},{"id":2824,"depth":1060,"text":2825,"children":11565},[11566,11567],{"id":2828,"depth":1077,"text":2829},{"id":3557,"depth":1077,"text":3558},{"id":4624,"depth":1060,"text":4625,"children":11569},[11570],{"id":4628,"depth":1077,"text":4629},{"id":7082,"depth":1060,"text":7083,"children":11572},[11573],{"id":7086,"depth":1077,"text":7087},{"id":8787,"depth":1060,"text":8788,"children":11575},[11576],{"id":8791,"depth":1077,"text":8792},{"id":10324,"depth":1060,"text":10325,"children":11578},[11579],{"id":10328,"depth":1077,"text":10329},"md",null,{},{"title":230,"description":1028},"vF55y1GQrQWNUTGDiuwf1WpDZta7nrgHtXy6ktopvXo",[11586,11588],{"title":226,"path":227,"stem":228,"description":11587,"children":-1},"Django's Forms API provides a powerful and flexible way to define, validate, and render forms. This chapter covers the complete process of creating forms using Django's declarative form system.",{"title":234,"path":235,"stem":236,"description":11589,"children":-1},"Django provides a comprehensive set of form fields and widgets that handle different data types and user interface elements. Understanding these built-in components enables you to create sophisticated forms without custom implementations.",1772474914436]