[{"data":1,"prerenderedAt":6579},["ShallowReactive",2],{"navigation":3,"/django-internals-and-contributing":1016,"/django-internals-and-contributing-surround":6574},[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":869,"body":1018,"description":6568,"extension":6569,"links":6570,"meta":6571,"navigation":3174,"path":870,"seo":6572,"stem":871,"__hash__":6573},"docs/26.django-internals-and-contributing/01.index.md",{"type":1019,"value":1020,"toc":6535},"minimark",[1021,1025,1029,1034,1039,1042,1147,1151,1157,1160,1315,1320,1323,1610,1615,1618,1783,1788,1791,2073,2077,2080,2335,2339,2342,2651,2655,2658,3108,3112,3120,3124,3128,3133,3275,3280,3396,3401,3404,3488,3492,3497,3520,3525,3586,3591,3791,3796,4006,4011,4078,4083,4153,4157,4162,4258,4263,4476,4481,4619,4623,4628,4752,4757,4865,4870,5027,5032,5122,5127,5192,5196,5200,5203,5209,5213,5216,5321,5325,5330,5333,5429,5433,5459,5463,5467,5624,5628,5951,5955,6428,6432,6436,6465,6469,6483,6487,6501,6505,6531],[1022,1023,869],"h1",{"id":1024},"django-internals-and-contributing",[1026,1027,1028],"p",{},"This guide explores Django's internal architecture and provides a comprehensive path to contributing to the Django project itself.",[1030,1031,1033],"h2",{"id":1032},"understanding-djangos-architecture","Understanding Django's Architecture",[1035,1036,1038],"h3",{"id":1037},"requestresponse-lifecycle","Request/Response Lifecycle",[1026,1040,1041],{},"Django's request handling follows a well-defined path:",[1043,1044,1049],"pre",{"className":1045,"code":1046,"language":1047,"meta":1048,"style":1048},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Simplified request flow\n\"\"\"\n1. WSGI/ASGI Handler receives request\n   ↓\n2. Middleware (request phase)\n   ↓\n3. URL Resolver matches pattern\n   ↓\n4. View function/class executes\n   ↓\n5. Template rendering (if applicable)\n   ↓\n6. Middleware (response phase)\n   ↓\n7. Response returned to client\n\"\"\"\n","python","",[1050,1051,1052,1061,1068,1075,1081,1087,1092,1098,1103,1109,1114,1120,1125,1131,1136,1142],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# Simplified request flow\n",[1053,1062,1064],{"class":1055,"line":1063},2,[1053,1065,1067],{"class":1066},"sm7ve","\"\"\"\n",[1053,1069,1071],{"class":1055,"line":1070},3,[1053,1072,1074],{"class":1073},"sVyVU","1. WSGI/ASGI Handler receives request\n",[1053,1076,1078],{"class":1055,"line":1077},4,[1053,1079,1080],{"class":1073},"   ↓\n",[1053,1082,1084],{"class":1055,"line":1083},5,[1053,1085,1086],{"class":1073},"2. Middleware (request phase)\n",[1053,1088,1090],{"class":1055,"line":1089},6,[1053,1091,1080],{"class":1073},[1053,1093,1095],{"class":1055,"line":1094},7,[1053,1096,1097],{"class":1073},"3. URL Resolver matches pattern\n",[1053,1099,1101],{"class":1055,"line":1100},8,[1053,1102,1080],{"class":1073},[1053,1104,1106],{"class":1055,"line":1105},9,[1053,1107,1108],{"class":1073},"4. View function/class executes\n",[1053,1110,1112],{"class":1055,"line":1111},10,[1053,1113,1080],{"class":1073},[1053,1115,1117],{"class":1055,"line":1116},11,[1053,1118,1119],{"class":1073},"5. Template rendering (if applicable)\n",[1053,1121,1123],{"class":1055,"line":1122},12,[1053,1124,1080],{"class":1073},[1053,1126,1128],{"class":1055,"line":1127},13,[1053,1129,1130],{"class":1073},"6. Middleware (response phase)\n",[1053,1132,1134],{"class":1055,"line":1133},14,[1053,1135,1080],{"class":1073},[1053,1137,1139],{"class":1055,"line":1138},15,[1053,1140,1141],{"class":1073},"7. Response returned to client\n",[1053,1143,1145],{"class":1055,"line":1144},16,[1053,1146,1067],{"class":1066},[1035,1148,1150],{"id":1149},"core-components","Core Components",[1026,1152,1153],{},[1154,1155,1156],"strong",{},"1. django.core",[1026,1158,1159],{},"The foundation of Django:",[1043,1161,1163],{"className":1045,"code":1162,"language":1047,"meta":1048,"style":1048},"# django/core/handlers/base.py\nclass BaseHandler:\n    \"\"\"\n    Base handler for all Django request handling.\n    Both WSGI and ASGI handlers inherit from this.\n    \"\"\"\n    \n    def load_middleware(self):\n        \"\"\"\n        Populate middleware lists from settings.MIDDLEWARE.\n        \"\"\"\n        # Middleware is loaded and chained here\n        pass\n    \n    def get_response(self, request):\n        \"\"\"\n        Main request handling logic.\n        \"\"\"\n        # URL resolution\n        # View execution\n        # Response processing\n        pass\n",[1050,1164,1165,1170,1184,1189,1194,1199,1203,1209,1228,1233,1238,1242,1247,1253,1257,1277,1281,1287,1292,1298,1304,1310],{"__ignoreMap":1048},[1053,1166,1167],{"class":1055,"line":1056},[1053,1168,1169],{"class":1059},"# django/core/handlers/base.py\n",[1053,1171,1172,1176,1180],{"class":1055,"line":1063},[1053,1173,1175],{"class":1174},"s5Kfy","class",[1053,1177,1179],{"class":1178},"sD-vU"," BaseHandler",[1053,1181,1183],{"class":1182},"soVBu",":\n",[1053,1185,1186],{"class":1055,"line":1070},[1053,1187,1188],{"class":1066},"    \"\"\"\n",[1053,1190,1191],{"class":1055,"line":1077},[1053,1192,1193],{"class":1073},"    Base handler for all Django request handling.\n",[1053,1195,1196],{"class":1055,"line":1083},[1053,1197,1198],{"class":1073},"    Both WSGI and ASGI handlers inherit from this.\n",[1053,1200,1201],{"class":1055,"line":1089},[1053,1202,1188],{"class":1066},[1053,1204,1205],{"class":1055,"line":1094},[1053,1206,1208],{"class":1207},"sftqT","    \n",[1053,1210,1211,1214,1218,1221,1225],{"class":1055,"line":1100},[1053,1212,1213],{"class":1174},"    def",[1053,1215,1217],{"class":1216},"sljsM"," load_middleware",[1053,1219,1220],{"class":1182},"(",[1053,1222,1224],{"class":1223},"sRjD_","self",[1053,1226,1227],{"class":1182},"):\n",[1053,1229,1230],{"class":1055,"line":1105},[1053,1231,1232],{"class":1066},"        \"\"\"\n",[1053,1234,1235],{"class":1055,"line":1111},[1053,1236,1237],{"class":1073},"        Populate middleware lists from settings.MIDDLEWARE.\n",[1053,1239,1240],{"class":1055,"line":1116},[1053,1241,1232],{"class":1066},[1053,1243,1244],{"class":1055,"line":1122},[1053,1245,1246],{"class":1059},"        # Middleware is loaded and chained here\n",[1053,1248,1249],{"class":1055,"line":1127},[1053,1250,1252],{"class":1251},"siDh9","        pass\n",[1053,1254,1255],{"class":1055,"line":1133},[1053,1256,1208],{"class":1207},[1053,1258,1259,1261,1264,1266,1268,1271,1275],{"class":1055,"line":1138},[1053,1260,1213],{"class":1174},[1053,1262,1263],{"class":1216}," get_response",[1053,1265,1220],{"class":1182},[1053,1267,1224],{"class":1223},[1053,1269,1270],{"class":1182},",",[1053,1272,1274],{"class":1273},"sCyAa"," request",[1053,1276,1227],{"class":1182},[1053,1278,1279],{"class":1055,"line":1144},[1053,1280,1232],{"class":1066},[1053,1282,1284],{"class":1055,"line":1283},17,[1053,1285,1286],{"class":1073},"        Main request handling logic.\n",[1053,1288,1290],{"class":1055,"line":1289},18,[1053,1291,1232],{"class":1066},[1053,1293,1295],{"class":1055,"line":1294},19,[1053,1296,1297],{"class":1059},"        # URL resolution\n",[1053,1299,1301],{"class":1055,"line":1300},20,[1053,1302,1303],{"class":1059},"        # View execution\n",[1053,1305,1307],{"class":1055,"line":1306},21,[1053,1308,1309],{"class":1059},"        # Response processing\n",[1053,1311,1313],{"class":1055,"line":1312},22,[1053,1314,1252],{"class":1251},[1026,1316,1317],{},[1154,1318,1319],{},"2. django.db",[1026,1321,1322],{},"Database abstraction layer:",[1043,1324,1326],{"className":1045,"code":1325,"language":1047,"meta":1048,"style":1048},"# django/db/models/query.py\nclass QuerySet:\n    \"\"\"\n    Represents a lazy database lookup for a set of objects.\n    \"\"\"\n    \n    def __init__(self, model=None, query=None, using=None, hints=None):\n        self.model = model\n        self._db = using\n        self._hints = hints or {}\n        self._query = query or sql.Query(self.model)\n        self._result_cache = None\n        self._sticky_filter = False\n        self._for_write = False\n        self._prefetch_related_lookups = ()\n        self._prefetch_done = False\n        self._known_related_objects = {}\n        self._iterable_class = ModelIterable\n        self._fields = None\n",[1050,1327,1328,1333,1342,1346,1351,1355,1359,1413,1432,1446,1466,1502,1516,1530,1543,1557,1570,1583,1597],{"__ignoreMap":1048},[1053,1329,1330],{"class":1055,"line":1056},[1053,1331,1332],{"class":1059},"# django/db/models/query.py\n",[1053,1334,1335,1337,1340],{"class":1055,"line":1063},[1053,1336,1175],{"class":1174},[1053,1338,1339],{"class":1178}," QuerySet",[1053,1341,1183],{"class":1182},[1053,1343,1344],{"class":1055,"line":1070},[1053,1345,1188],{"class":1066},[1053,1347,1348],{"class":1055,"line":1077},[1053,1349,1350],{"class":1073},"    Represents a lazy database lookup for a set of objects.\n",[1053,1352,1353],{"class":1055,"line":1083},[1053,1354,1188],{"class":1066},[1053,1356,1357],{"class":1055,"line":1089},[1053,1358,1208],{"class":1207},[1053,1360,1361,1363,1367,1369,1371,1373,1376,1380,1384,1386,1389,1391,1393,1395,1398,1400,1402,1404,1407,1409,1411],{"class":1055,"line":1094},[1053,1362,1213],{"class":1174},[1053,1364,1366],{"class":1365},"sJdAF"," __init__",[1053,1368,1220],{"class":1182},[1053,1370,1224],{"class":1223},[1053,1372,1270],{"class":1182},[1053,1374,1375],{"class":1273}," model",[1053,1377,1379],{"class":1378},"sVsLi","=",[1053,1381,1383],{"class":1382},"s8XtY","None",[1053,1385,1270],{"class":1182},[1053,1387,1388],{"class":1273}," query",[1053,1390,1379],{"class":1378},[1053,1392,1383],{"class":1382},[1053,1394,1270],{"class":1182},[1053,1396,1397],{"class":1273}," using",[1053,1399,1379],{"class":1378},[1053,1401,1383],{"class":1382},[1053,1403,1270],{"class":1182},[1053,1405,1406],{"class":1273}," hints",[1053,1408,1379],{"class":1378},[1053,1410,1383],{"class":1382},[1053,1412,1227],{"class":1182},[1053,1414,1415,1419,1422,1426,1429],{"class":1055,"line":1100},[1053,1416,1418],{"class":1417},"se3Ec","        self",[1053,1420,1421],{"class":1182},".",[1053,1423,1425],{"class":1424},"sBPpx","model",[1053,1427,1428],{"class":1182}," =",[1053,1430,1431],{"class":1207}," model\n",[1053,1433,1434,1436,1438,1441,1443],{"class":1055,"line":1105},[1053,1435,1418],{"class":1417},[1053,1437,1421],{"class":1182},[1053,1439,1440],{"class":1424},"_db",[1053,1442,1428],{"class":1182},[1053,1444,1445],{"class":1207}," using\n",[1053,1447,1448,1450,1452,1455,1457,1460,1463],{"class":1055,"line":1111},[1053,1449,1418],{"class":1417},[1053,1451,1421],{"class":1182},[1053,1453,1454],{"class":1424},"_hints",[1053,1456,1428],{"class":1182},[1053,1458,1459],{"class":1207}," hints ",[1053,1461,1462],{"class":1378},"or",[1053,1464,1465],{"class":1182}," {}\n",[1053,1467,1468,1470,1472,1475,1477,1480,1482,1485,1487,1491,1493,1495,1497,1499],{"class":1055,"line":1116},[1053,1469,1418],{"class":1417},[1053,1471,1421],{"class":1182},[1053,1473,1474],{"class":1424},"_query",[1053,1476,1428],{"class":1182},[1053,1478,1479],{"class":1207}," query ",[1053,1481,1462],{"class":1378},[1053,1483,1484],{"class":1207}," sql",[1053,1486,1421],{"class":1182},[1053,1488,1490],{"class":1489},"siWMO","Query",[1053,1492,1220],{"class":1182},[1053,1494,1224],{"class":1417},[1053,1496,1421],{"class":1182},[1053,1498,1425],{"class":1424},[1053,1500,1501],{"class":1182},")\n",[1053,1503,1504,1506,1508,1511,1513],{"class":1055,"line":1122},[1053,1505,1418],{"class":1417},[1053,1507,1421],{"class":1182},[1053,1509,1510],{"class":1424},"_result_cache",[1053,1512,1428],{"class":1182},[1053,1514,1515],{"class":1382}," None\n",[1053,1517,1518,1520,1522,1525,1527],{"class":1055,"line":1127},[1053,1519,1418],{"class":1417},[1053,1521,1421],{"class":1182},[1053,1523,1524],{"class":1424},"_sticky_filter",[1053,1526,1428],{"class":1182},[1053,1528,1529],{"class":1382}," False\n",[1053,1531,1532,1534,1536,1539,1541],{"class":1055,"line":1133},[1053,1533,1418],{"class":1417},[1053,1535,1421],{"class":1182},[1053,1537,1538],{"class":1424},"_for_write",[1053,1540,1428],{"class":1182},[1053,1542,1529],{"class":1382},[1053,1544,1545,1547,1549,1552,1554],{"class":1055,"line":1138},[1053,1546,1418],{"class":1417},[1053,1548,1421],{"class":1182},[1053,1550,1551],{"class":1424},"_prefetch_related_lookups",[1053,1553,1428],{"class":1182},[1053,1555,1556],{"class":1182}," ()\n",[1053,1558,1559,1561,1563,1566,1568],{"class":1055,"line":1144},[1053,1560,1418],{"class":1417},[1053,1562,1421],{"class":1182},[1053,1564,1565],{"class":1424},"_prefetch_done",[1053,1567,1428],{"class":1182},[1053,1569,1529],{"class":1382},[1053,1571,1572,1574,1576,1579,1581],{"class":1055,"line":1283},[1053,1573,1418],{"class":1417},[1053,1575,1421],{"class":1182},[1053,1577,1578],{"class":1424},"_known_related_objects",[1053,1580,1428],{"class":1182},[1053,1582,1465],{"class":1182},[1053,1584,1585,1587,1589,1592,1594],{"class":1055,"line":1289},[1053,1586,1418],{"class":1417},[1053,1588,1421],{"class":1182},[1053,1590,1591],{"class":1424},"_iterable_class",[1053,1593,1428],{"class":1182},[1053,1595,1596],{"class":1207}," ModelIterable\n",[1053,1598,1599,1601,1603,1606,1608],{"class":1055,"line":1294},[1053,1600,1418],{"class":1417},[1053,1602,1421],{"class":1182},[1053,1604,1605],{"class":1424},"_fields",[1053,1607,1428],{"class":1182},[1053,1609,1515],{"class":1382},[1026,1611,1612],{},[1154,1613,1614],{},"3. django.template",[1026,1616,1617],{},"Template engine:",[1043,1619,1621],{"className":1045,"code":1620,"language":1047,"meta":1048,"style":1048},"# django/template/base.py\nclass Template:\n    \"\"\"\n    Represents a compiled template.\n    \"\"\"\n    \n    def __init__(self, template_string, origin=None, name=None, engine=None):\n        # Compile template into nodes\n        self.nodelist = self.compile_nodelist()\n    \n    def render(self, context):\n        \"\"\"\n        Render the template with the given context.\n        \"\"\"\n        return self.nodelist.render(context)\n",[1050,1622,1623,1628,1637,1641,1646,1650,1654,1698,1703,1725,1729,1747,1751,1756,1760],{"__ignoreMap":1048},[1053,1624,1625],{"class":1055,"line":1056},[1053,1626,1627],{"class":1059},"# django/template/base.py\n",[1053,1629,1630,1632,1635],{"class":1055,"line":1063},[1053,1631,1175],{"class":1174},[1053,1633,1634],{"class":1178}," Template",[1053,1636,1183],{"class":1182},[1053,1638,1639],{"class":1055,"line":1070},[1053,1640,1188],{"class":1066},[1053,1642,1643],{"class":1055,"line":1077},[1053,1644,1645],{"class":1073},"    Represents a compiled template.\n",[1053,1647,1648],{"class":1055,"line":1083},[1053,1649,1188],{"class":1066},[1053,1651,1652],{"class":1055,"line":1089},[1053,1653,1208],{"class":1207},[1053,1655,1656,1658,1660,1662,1664,1666,1669,1671,1674,1676,1678,1680,1683,1685,1687,1689,1692,1694,1696],{"class":1055,"line":1094},[1053,1657,1213],{"class":1174},[1053,1659,1366],{"class":1365},[1053,1661,1220],{"class":1182},[1053,1663,1224],{"class":1223},[1053,1665,1270],{"class":1182},[1053,1667,1668],{"class":1273}," template_string",[1053,1670,1270],{"class":1182},[1053,1672,1673],{"class":1273}," origin",[1053,1675,1379],{"class":1378},[1053,1677,1383],{"class":1382},[1053,1679,1270],{"class":1182},[1053,1681,1682],{"class":1273}," name",[1053,1684,1379],{"class":1378},[1053,1686,1383],{"class":1382},[1053,1688,1270],{"class":1182},[1053,1690,1691],{"class":1273}," engine",[1053,1693,1379],{"class":1378},[1053,1695,1383],{"class":1382},[1053,1697,1227],{"class":1182},[1053,1699,1700],{"class":1055,"line":1100},[1053,1701,1702],{"class":1059},"        # Compile template into nodes\n",[1053,1704,1705,1707,1709,1712,1714,1717,1719,1722],{"class":1055,"line":1105},[1053,1706,1418],{"class":1417},[1053,1708,1421],{"class":1182},[1053,1710,1711],{"class":1424},"nodelist",[1053,1713,1428],{"class":1182},[1053,1715,1716],{"class":1417}," self",[1053,1718,1421],{"class":1182},[1053,1720,1721],{"class":1489},"compile_nodelist",[1053,1723,1724],{"class":1182},"()\n",[1053,1726,1727],{"class":1055,"line":1111},[1053,1728,1208],{"class":1207},[1053,1730,1731,1733,1736,1738,1740,1742,1745],{"class":1055,"line":1116},[1053,1732,1213],{"class":1174},[1053,1734,1735],{"class":1216}," render",[1053,1737,1220],{"class":1182},[1053,1739,1224],{"class":1223},[1053,1741,1270],{"class":1182},[1053,1743,1744],{"class":1273}," context",[1053,1746,1227],{"class":1182},[1053,1748,1749],{"class":1055,"line":1122},[1053,1750,1232],{"class":1066},[1053,1752,1753],{"class":1055,"line":1127},[1053,1754,1755],{"class":1073},"        Render the template with the given context.\n",[1053,1757,1758],{"class":1055,"line":1133},[1053,1759,1232],{"class":1066},[1053,1761,1762,1765,1767,1769,1771,1773,1776,1778,1781],{"class":1055,"line":1138},[1053,1763,1764],{"class":1251},"        return",[1053,1766,1716],{"class":1417},[1053,1768,1421],{"class":1182},[1053,1770,1711],{"class":1424},[1053,1772,1421],{"class":1182},[1053,1774,1775],{"class":1489},"render",[1053,1777,1220],{"class":1182},[1053,1779,1780],{"class":1489},"context",[1053,1782,1501],{"class":1182},[1026,1784,1785],{},[1154,1786,1787],{},"4. django.forms",[1026,1789,1790],{},"Form handling:",[1043,1792,1794],{"className":1045,"code":1793,"language":1047,"meta":1048,"style":1048},"# django/forms/forms.py\nclass BaseForm:\n    \"\"\"\n    Base class for all forms.\n    \"\"\"\n    \n    def __init__(self, data=None, files=None, auto_id='id_%s', \n                 prefix=None, initial=None, error_class=ErrorList,\n                 label_suffix=None, empty_permitted=False, \n                 field_order=None, use_required_attribute=None, \n                 renderer=None):\n        # Initialize form state\n        self.is_bound = data is not None or files is not None\n        self.data = MultiValueDict() if data is None else data\n        self.files = MultiValueDict() if files is None else files\n        # ... more initialization\n",[1050,1795,1796,1801,1810,1814,1819,1823,1827,1881,1912,1935,1957,1968,1973,2008,2040,2068],{"__ignoreMap":1048},[1053,1797,1798],{"class":1055,"line":1056},[1053,1799,1800],{"class":1059},"# django/forms/forms.py\n",[1053,1802,1803,1805,1808],{"class":1055,"line":1063},[1053,1804,1175],{"class":1174},[1053,1806,1807],{"class":1178}," BaseForm",[1053,1809,1183],{"class":1182},[1053,1811,1812],{"class":1055,"line":1070},[1053,1813,1188],{"class":1066},[1053,1815,1816],{"class":1055,"line":1077},[1053,1817,1818],{"class":1073},"    Base class for all forms.\n",[1053,1820,1821],{"class":1055,"line":1083},[1053,1822,1188],{"class":1066},[1053,1824,1825],{"class":1055,"line":1089},[1053,1826,1208],{"class":1207},[1053,1828,1829,1831,1833,1835,1837,1839,1842,1844,1846,1848,1851,1853,1855,1857,1860,1862,1866,1870,1874,1876,1878],{"class":1055,"line":1094},[1053,1830,1213],{"class":1174},[1053,1832,1366],{"class":1365},[1053,1834,1220],{"class":1182},[1053,1836,1224],{"class":1223},[1053,1838,1270],{"class":1182},[1053,1840,1841],{"class":1273}," data",[1053,1843,1379],{"class":1378},[1053,1845,1383],{"class":1382},[1053,1847,1270],{"class":1182},[1053,1849,1850],{"class":1273}," files",[1053,1852,1379],{"class":1378},[1053,1854,1383],{"class":1382},[1053,1856,1270],{"class":1182},[1053,1858,1859],{"class":1273}," auto_id",[1053,1861,1379],{"class":1378},[1053,1863,1865],{"class":1864},"sbYkP","'",[1053,1867,1869],{"class":1868},"sTbE_","id_",[1053,1871,1873],{"class":1872},"s3h35","%s",[1053,1875,1865],{"class":1864},[1053,1877,1270],{"class":1182},[1053,1879,1880],{"class":1207}," \n",[1053,1882,1883,1886,1888,1890,1892,1895,1897,1899,1901,1904,1906,1909],{"class":1055,"line":1100},[1053,1884,1885],{"class":1273},"                 prefix",[1053,1887,1379],{"class":1378},[1053,1889,1383],{"class":1382},[1053,1891,1270],{"class":1182},[1053,1893,1894],{"class":1273}," initial",[1053,1896,1379],{"class":1378},[1053,1898,1383],{"class":1382},[1053,1900,1270],{"class":1182},[1053,1902,1903],{"class":1273}," error_class",[1053,1905,1379],{"class":1378},[1053,1907,1908],{"class":1207},"ErrorList",[1053,1910,1911],{"class":1182},",\n",[1053,1913,1914,1917,1919,1921,1923,1926,1928,1931,1933],{"class":1055,"line":1105},[1053,1915,1916],{"class":1273},"                 label_suffix",[1053,1918,1379],{"class":1378},[1053,1920,1383],{"class":1382},[1053,1922,1270],{"class":1182},[1053,1924,1925],{"class":1273}," empty_permitted",[1053,1927,1379],{"class":1378},[1053,1929,1930],{"class":1382},"False",[1053,1932,1270],{"class":1182},[1053,1934,1880],{"class":1207},[1053,1936,1937,1940,1942,1944,1946,1949,1951,1953,1955],{"class":1055,"line":1111},[1053,1938,1939],{"class":1273},"                 field_order",[1053,1941,1379],{"class":1378},[1053,1943,1383],{"class":1382},[1053,1945,1270],{"class":1182},[1053,1947,1948],{"class":1273}," use_required_attribute",[1053,1950,1379],{"class":1378},[1053,1952,1383],{"class":1382},[1053,1954,1270],{"class":1182},[1053,1956,1880],{"class":1207},[1053,1958,1959,1962,1964,1966],{"class":1055,"line":1116},[1053,1960,1961],{"class":1273},"                 renderer",[1053,1963,1379],{"class":1378},[1053,1965,1383],{"class":1382},[1053,1967,1227],{"class":1182},[1053,1969,1970],{"class":1055,"line":1122},[1053,1971,1972],{"class":1059},"        # Initialize form state\n",[1053,1974,1975,1977,1979,1982,1984,1987,1990,1993,1996,1999,2002,2004,2006],{"class":1055,"line":1127},[1053,1976,1418],{"class":1417},[1053,1978,1421],{"class":1182},[1053,1980,1981],{"class":1424},"is_bound",[1053,1983,1428],{"class":1182},[1053,1985,1986],{"class":1207}," data ",[1053,1988,1989],{"class":1378},"is",[1053,1991,1992],{"class":1378}," not",[1053,1994,1995],{"class":1382}," None",[1053,1997,1998],{"class":1378}," or",[1053,2000,2001],{"class":1207}," files ",[1053,2003,1989],{"class":1378},[1053,2005,1992],{"class":1378},[1053,2007,1515],{"class":1382},[1053,2009,2010,2012,2014,2017,2019,2022,2025,2028,2030,2032,2034,2037],{"class":1055,"line":1133},[1053,2011,1418],{"class":1417},[1053,2013,1421],{"class":1182},[1053,2015,2016],{"class":1424},"data",[1053,2018,1428],{"class":1182},[1053,2020,2021],{"class":1489}," MultiValueDict",[1053,2023,2024],{"class":1182},"()",[1053,2026,2027],{"class":1251}," if",[1053,2029,1986],{"class":1207},[1053,2031,1989],{"class":1378},[1053,2033,1995],{"class":1382},[1053,2035,2036],{"class":1251}," else",[1053,2038,2039],{"class":1207}," data\n",[1053,2041,2042,2044,2046,2049,2051,2053,2055,2057,2059,2061,2063,2065],{"class":1055,"line":1138},[1053,2043,1418],{"class":1417},[1053,2045,1421],{"class":1182},[1053,2047,2048],{"class":1424},"files",[1053,2050,1428],{"class":1182},[1053,2052,2021],{"class":1489},[1053,2054,2024],{"class":1182},[1053,2056,2027],{"class":1251},[1053,2058,2001],{"class":1207},[1053,2060,1989],{"class":1378},[1053,2062,1995],{"class":1382},[1053,2064,2036],{"class":1251},[1053,2066,2067],{"class":1207}," files\n",[1053,2069,2070],{"class":1055,"line":1144},[1053,2071,2072],{"class":1059},"        # ... more initialization\n",[1035,2074,2076],{"id":2075},"signal-system","Signal System",[1026,2078,2079],{},"Django's signal dispatcher:",[1043,2081,2083],{"className":1045,"code":2082,"language":1047,"meta":1048,"style":1048},"# django/dispatch/dispatcher.py\nclass Signal:\n    \"\"\"\n    Base class for all signals.\n    \"\"\"\n    \n    def __init__(self, use_caching=False):\n        self.receivers = []\n        self.use_caching = use_caching\n        self.sender_receivers_cache = weakref.WeakKeyDictionary() if use_caching else {}\n        self._dead_receivers = False\n    \n    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):\n        \"\"\"\n        Connect receiver to sender for signal.\n        \"\"\"\n        # Register receiver\n        pass\n    \n    def send(self, sender, **named):\n        \"\"\"\n        Send signal from sender to all connected receivers.\n        \"\"\"\n        # Notify all receivers\n        pass\n",[1050,2084,2085,2090,2099,2103,2108,2112,2116,2137,2151,2165,2196,2209,2213,2259,2263,2268,2272,2277,2281,2285,2310,2314,2319,2324,2330],{"__ignoreMap":1048},[1053,2086,2087],{"class":1055,"line":1056},[1053,2088,2089],{"class":1059},"# django/dispatch/dispatcher.py\n",[1053,2091,2092,2094,2097],{"class":1055,"line":1063},[1053,2093,1175],{"class":1174},[1053,2095,2096],{"class":1178}," Signal",[1053,2098,1183],{"class":1182},[1053,2100,2101],{"class":1055,"line":1070},[1053,2102,1188],{"class":1066},[1053,2104,2105],{"class":1055,"line":1077},[1053,2106,2107],{"class":1073},"    Base class for all signals.\n",[1053,2109,2110],{"class":1055,"line":1083},[1053,2111,1188],{"class":1066},[1053,2113,2114],{"class":1055,"line":1089},[1053,2115,1208],{"class":1207},[1053,2117,2118,2120,2122,2124,2126,2128,2131,2133,2135],{"class":1055,"line":1094},[1053,2119,1213],{"class":1174},[1053,2121,1366],{"class":1365},[1053,2123,1220],{"class":1182},[1053,2125,1224],{"class":1223},[1053,2127,1270],{"class":1182},[1053,2129,2130],{"class":1273}," use_caching",[1053,2132,1379],{"class":1378},[1053,2134,1930],{"class":1382},[1053,2136,1227],{"class":1182},[1053,2138,2139,2141,2143,2146,2148],{"class":1055,"line":1100},[1053,2140,1418],{"class":1417},[1053,2142,1421],{"class":1182},[1053,2144,2145],{"class":1424},"receivers",[1053,2147,1428],{"class":1182},[1053,2149,2150],{"class":1182}," []\n",[1053,2152,2153,2155,2157,2160,2162],{"class":1055,"line":1105},[1053,2154,1418],{"class":1417},[1053,2156,1421],{"class":1182},[1053,2158,2159],{"class":1424},"use_caching",[1053,2161,1428],{"class":1182},[1053,2163,2164],{"class":1207}," use_caching\n",[1053,2166,2167,2169,2171,2174,2176,2179,2181,2184,2186,2188,2191,2194],{"class":1055,"line":1111},[1053,2168,1418],{"class":1417},[1053,2170,1421],{"class":1182},[1053,2172,2173],{"class":1424},"sender_receivers_cache",[1053,2175,1428],{"class":1182},[1053,2177,2178],{"class":1207}," weakref",[1053,2180,1421],{"class":1182},[1053,2182,2183],{"class":1489},"WeakKeyDictionary",[1053,2185,2024],{"class":1182},[1053,2187,2027],{"class":1251},[1053,2189,2190],{"class":1207}," use_caching ",[1053,2192,2193],{"class":1251},"else",[1053,2195,1465],{"class":1182},[1053,2197,2198,2200,2202,2205,2207],{"class":1055,"line":1116},[1053,2199,1418],{"class":1417},[1053,2201,1421],{"class":1182},[1053,2203,2204],{"class":1424},"_dead_receivers",[1053,2206,1428],{"class":1182},[1053,2208,1529],{"class":1382},[1053,2210,2211],{"class":1055,"line":1122},[1053,2212,1208],{"class":1207},[1053,2214,2215,2217,2220,2222,2224,2226,2229,2231,2234,2236,2238,2240,2243,2245,2248,2250,2253,2255,2257],{"class":1055,"line":1127},[1053,2216,1213],{"class":1174},[1053,2218,2219],{"class":1216}," connect",[1053,2221,1220],{"class":1182},[1053,2223,1224],{"class":1223},[1053,2225,1270],{"class":1182},[1053,2227,2228],{"class":1273}," receiver",[1053,2230,1270],{"class":1182},[1053,2232,2233],{"class":1273}," sender",[1053,2235,1379],{"class":1378},[1053,2237,1383],{"class":1382},[1053,2239,1270],{"class":1182},[1053,2241,2242],{"class":1273}," weak",[1053,2244,1379],{"class":1378},[1053,2246,2247],{"class":1382},"True",[1053,2249,1270],{"class":1182},[1053,2251,2252],{"class":1273}," dispatch_uid",[1053,2254,1379],{"class":1378},[1053,2256,1383],{"class":1382},[1053,2258,1227],{"class":1182},[1053,2260,2261],{"class":1055,"line":1133},[1053,2262,1232],{"class":1066},[1053,2264,2265],{"class":1055,"line":1138},[1053,2266,2267],{"class":1073},"        Connect receiver to sender for signal.\n",[1053,2269,2270],{"class":1055,"line":1144},[1053,2271,1232],{"class":1066},[1053,2273,2274],{"class":1055,"line":1283},[1053,2275,2276],{"class":1059},"        # Register receiver\n",[1053,2278,2279],{"class":1055,"line":1289},[1053,2280,1252],{"class":1251},[1053,2282,2283],{"class":1055,"line":1294},[1053,2284,1208],{"class":1207},[1053,2286,2287,2289,2292,2294,2296,2298,2300,2302,2305,2308],{"class":1055,"line":1300},[1053,2288,1213],{"class":1174},[1053,2290,2291],{"class":1216}," send",[1053,2293,1220],{"class":1182},[1053,2295,1224],{"class":1223},[1053,2297,1270],{"class":1182},[1053,2299,2233],{"class":1273},[1053,2301,1270],{"class":1182},[1053,2303,2304],{"class":1378}," **",[1053,2306,2307],{"class":1273},"named",[1053,2309,1227],{"class":1182},[1053,2311,2312],{"class":1055,"line":1306},[1053,2313,1232],{"class":1066},[1053,2315,2316],{"class":1055,"line":1312},[1053,2317,2318],{"class":1073},"        Send signal from sender to all connected receivers.\n",[1053,2320,2322],{"class":1055,"line":2321},23,[1053,2323,1232],{"class":1066},[1053,2325,2327],{"class":1055,"line":2326},24,[1053,2328,2329],{"class":1059},"        # Notify all receivers\n",[1053,2331,2333],{"class":1055,"line":2332},25,[1053,2334,1252],{"class":1251},[1035,2336,2338],{"id":2337},"middleware-chain","Middleware Chain",[1026,2340,2341],{},"How middleware is processed:",[1043,2343,2345],{"className":1045,"code":2344,"language":1047,"meta":1048,"style":1048},"# django/core/handlers/base.py\ndef _get_response(self, request):\n    \"\"\"\n    Resolve and call the view, then apply view, exception, and\n    template response middleware.\n    \"\"\"\n    response = None\n    callback, callback_args, callback_kwargs = self.resolve_request(request)\n    \n    # Apply view middleware\n    for middleware_method in self._view_middleware:\n        response = middleware_method(request, callback, callback_args, callback_kwargs)\n        if response:\n            break\n    \n    if response is None:\n        # Call the view\n        response = callback(request, *callback_args, **callback_kwargs)\n    \n    # Apply template response middleware\n    if hasattr(response, 'render') and callable(response.render):\n        for middleware_method in self._template_response_middleware:\n            response = middleware_method(request, response)\n    \n    return response\n",[1050,2346,2347,2351,2369,2373,2378,2383,2387,2396,2427,2431,2436,2456,2486,2496,2501,2505,2519,2524,2553,2557,2562,2602,2620,2639,2643],{"__ignoreMap":1048},[1053,2348,2349],{"class":1055,"line":1056},[1053,2350,1169],{"class":1059},[1053,2352,2353,2356,2359,2361,2363,2365,2367],{"class":1055,"line":1063},[1053,2354,2355],{"class":1174},"def",[1053,2357,2358],{"class":1216}," _get_response",[1053,2360,1220],{"class":1182},[1053,2362,1224],{"class":1223},[1053,2364,1270],{"class":1182},[1053,2366,1274],{"class":1273},[1053,2368,1227],{"class":1182},[1053,2370,2371],{"class":1055,"line":1070},[1053,2372,1188],{"class":1066},[1053,2374,2375],{"class":1055,"line":1077},[1053,2376,2377],{"class":1073},"    Resolve and call the view, then apply view, exception, and\n",[1053,2379,2380],{"class":1055,"line":1083},[1053,2381,2382],{"class":1073},"    template response middleware.\n",[1053,2384,2385],{"class":1055,"line":1089},[1053,2386,1188],{"class":1066},[1053,2388,2389,2392,2394],{"class":1055,"line":1094},[1053,2390,2391],{"class":1207},"    response ",[1053,2393,1379],{"class":1182},[1053,2395,1515],{"class":1382},[1053,2397,2398,2401,2403,2406,2408,2411,2413,2415,2417,2420,2422,2425],{"class":1055,"line":1100},[1053,2399,2400],{"class":1207},"    callback",[1053,2402,1270],{"class":1182},[1053,2404,2405],{"class":1207}," callback_args",[1053,2407,1270],{"class":1182},[1053,2409,2410],{"class":1207}," callback_kwargs ",[1053,2412,1379],{"class":1182},[1053,2414,1716],{"class":1417},[1053,2416,1421],{"class":1182},[1053,2418,2419],{"class":1489},"resolve_request",[1053,2421,1220],{"class":1182},[1053,2423,2424],{"class":1489},"request",[1053,2426,1501],{"class":1182},[1053,2428,2429],{"class":1055,"line":1105},[1053,2430,1208],{"class":1207},[1053,2432,2433],{"class":1055,"line":1111},[1053,2434,2435],{"class":1059},"    # Apply view middleware\n",[1053,2437,2438,2441,2444,2447,2449,2451,2454],{"class":1055,"line":1116},[1053,2439,2440],{"class":1251},"    for",[1053,2442,2443],{"class":1207}," middleware_method ",[1053,2445,2446],{"class":1251},"in",[1053,2448,1716],{"class":1417},[1053,2450,1421],{"class":1182},[1053,2452,2453],{"class":1424},"_view_middleware",[1053,2455,1183],{"class":1182},[1053,2457,2458,2461,2463,2466,2468,2470,2472,2475,2477,2479,2481,2484],{"class":1055,"line":1122},[1053,2459,2460],{"class":1207},"        response ",[1053,2462,1379],{"class":1182},[1053,2464,2465],{"class":1489}," middleware_method",[1053,2467,1220],{"class":1182},[1053,2469,2424],{"class":1489},[1053,2471,1270],{"class":1182},[1053,2473,2474],{"class":1489}," callback",[1053,2476,1270],{"class":1182},[1053,2478,2405],{"class":1489},[1053,2480,1270],{"class":1182},[1053,2482,2483],{"class":1489}," callback_kwargs",[1053,2485,1501],{"class":1182},[1053,2487,2488,2491,2494],{"class":1055,"line":1127},[1053,2489,2490],{"class":1251},"        if",[1053,2492,2493],{"class":1207}," response",[1053,2495,1183],{"class":1182},[1053,2497,2498],{"class":1055,"line":1133},[1053,2499,2500],{"class":1251},"            break\n",[1053,2502,2503],{"class":1055,"line":1138},[1053,2504,1208],{"class":1207},[1053,2506,2507,2510,2513,2515,2517],{"class":1055,"line":1144},[1053,2508,2509],{"class":1251},"    if",[1053,2511,2512],{"class":1207}," response ",[1053,2514,1989],{"class":1378},[1053,2516,1995],{"class":1382},[1053,2518,1183],{"class":1182},[1053,2520,2521],{"class":1055,"line":1283},[1053,2522,2523],{"class":1059},"        # Call the view\n",[1053,2525,2526,2528,2530,2532,2534,2536,2538,2541,2544,2546,2548,2551],{"class":1055,"line":1289},[1053,2527,2460],{"class":1207},[1053,2529,1379],{"class":1182},[1053,2531,2474],{"class":1489},[1053,2533,1220],{"class":1182},[1053,2535,2424],{"class":1489},[1053,2537,1270],{"class":1182},[1053,2539,2540],{"class":1378}," *",[1053,2542,2543],{"class":1489},"callback_args",[1053,2545,1270],{"class":1182},[1053,2547,2304],{"class":1378},[1053,2549,2550],{"class":1489},"callback_kwargs",[1053,2552,1501],{"class":1182},[1053,2554,2555],{"class":1055,"line":1294},[1053,2556,1208],{"class":1207},[1053,2558,2559],{"class":1055,"line":1300},[1053,2560,2561],{"class":1059},"    # Apply template response middleware\n",[1053,2563,2564,2566,2569,2571,2574,2576,2579,2581,2583,2586,2589,2592,2594,2596,2598,2600],{"class":1055,"line":1306},[1053,2565,2509],{"class":1251},[1053,2567,2568],{"class":1365}," hasattr",[1053,2570,1220],{"class":1182},[1053,2572,2573],{"class":1489},"response",[1053,2575,1270],{"class":1182},[1053,2577,2578],{"class":1864}," '",[1053,2580,1775],{"class":1868},[1053,2582,1865],{"class":1864},[1053,2584,2585],{"class":1182},")",[1053,2587,2588],{"class":1378}," and",[1053,2590,2591],{"class":1365}," callable",[1053,2593,1220],{"class":1182},[1053,2595,2573],{"class":1489},[1053,2597,1421],{"class":1182},[1053,2599,1775],{"class":1424},[1053,2601,1227],{"class":1182},[1053,2603,2604,2607,2609,2611,2613,2615,2618],{"class":1055,"line":1312},[1053,2605,2606],{"class":1251},"        for",[1053,2608,2443],{"class":1207},[1053,2610,2446],{"class":1251},[1053,2612,1716],{"class":1417},[1053,2614,1421],{"class":1182},[1053,2616,2617],{"class":1424},"_template_response_middleware",[1053,2619,1183],{"class":1182},[1053,2621,2622,2625,2627,2629,2631,2633,2635,2637],{"class":1055,"line":2321},[1053,2623,2624],{"class":1207},"            response ",[1053,2626,1379],{"class":1182},[1053,2628,2465],{"class":1489},[1053,2630,1220],{"class":1182},[1053,2632,2424],{"class":1489},[1053,2634,1270],{"class":1182},[1053,2636,2493],{"class":1489},[1053,2638,1501],{"class":1182},[1053,2640,2641],{"class":1055,"line":2326},[1053,2642,1208],{"class":1207},[1053,2644,2645,2648],{"class":1055,"line":2332},[1053,2646,2647],{"class":1251},"    return",[1053,2649,2650],{"class":1207}," response\n",[1035,2652,2654],{"id":2653},"url-resolution","URL Resolution",[1026,2656,2657],{},"How Django matches URLs:",[1043,2659,2661],{"className":1045,"code":2660,"language":1047,"meta":1048,"style":1048},"# django/urls/resolvers.py\nclass URLResolver:\n    \"\"\"\n    A URL resolver that matches URL patterns to views.\n    \"\"\"\n    \n    def resolve(self, path):\n        \"\"\"\n        Match path against URL patterns.\n        \"\"\"\n        tried = []\n        match = self.pattern.match(path)\n        \n        if match:\n            new_path, args, kwargs = match\n            for pattern in self.url_patterns:\n                try:\n                    sub_match = pattern.resolve(new_path)\n                except Resolver404 as e:\n                    tried.extend(e.args[0]['tried'])\n                else:\n                    if sub_match:\n                        # Merge captured arguments\n                        sub_match_dict = {**kwargs, **sub_match.kwargs}\n                        return ResolverMatch(\n                            sub_match.func,\n                            sub_match.args,\n                            sub_match_dict,\n                            sub_match.url_name,\n                            [self.app_name] + sub_match.app_names,\n                            [self.namespace] + sub_match.namespaces,\n                        )\n        \n        raise Resolver404({'tried': tried, 'path': path})\n",[1050,2662,2663,2668,2677,2681,2686,2690,2694,2712,2716,2721,2725,2734,2760,2765,2774,2794,2813,2820,2842,2858,2898,2905,2915,2920,2950,2961,2974,2985,2993,3005,3033,3058,3064,3069],{"__ignoreMap":1048},[1053,2664,2665],{"class":1055,"line":1056},[1053,2666,2667],{"class":1059},"# django/urls/resolvers.py\n",[1053,2669,2670,2672,2675],{"class":1055,"line":1063},[1053,2671,1175],{"class":1174},[1053,2673,2674],{"class":1178}," URLResolver",[1053,2676,1183],{"class":1182},[1053,2678,2679],{"class":1055,"line":1070},[1053,2680,1188],{"class":1066},[1053,2682,2683],{"class":1055,"line":1077},[1053,2684,2685],{"class":1073},"    A URL resolver that matches URL patterns to views.\n",[1053,2687,2688],{"class":1055,"line":1083},[1053,2689,1188],{"class":1066},[1053,2691,2692],{"class":1055,"line":1089},[1053,2693,1208],{"class":1207},[1053,2695,2696,2698,2701,2703,2705,2707,2710],{"class":1055,"line":1094},[1053,2697,1213],{"class":1174},[1053,2699,2700],{"class":1216}," resolve",[1053,2702,1220],{"class":1182},[1053,2704,1224],{"class":1223},[1053,2706,1270],{"class":1182},[1053,2708,2709],{"class":1273}," path",[1053,2711,1227],{"class":1182},[1053,2713,2714],{"class":1055,"line":1100},[1053,2715,1232],{"class":1066},[1053,2717,2718],{"class":1055,"line":1105},[1053,2719,2720],{"class":1073},"        Match path against URL patterns.\n",[1053,2722,2723],{"class":1055,"line":1111},[1053,2724,1232],{"class":1066},[1053,2726,2727,2730,2732],{"class":1055,"line":1116},[1053,2728,2729],{"class":1207},"        tried ",[1053,2731,1379],{"class":1182},[1053,2733,2150],{"class":1182},[1053,2735,2736,2739,2741,2743,2745,2748,2750,2753,2755,2758],{"class":1055,"line":1122},[1053,2737,2738],{"class":1207},"        match ",[1053,2740,1379],{"class":1182},[1053,2742,1716],{"class":1417},[1053,2744,1421],{"class":1182},[1053,2746,2747],{"class":1424},"pattern",[1053,2749,1421],{"class":1182},[1053,2751,2752],{"class":1489},"match",[1053,2754,1220],{"class":1182},[1053,2756,2757],{"class":1489},"path",[1053,2759,1501],{"class":1182},[1053,2761,2762],{"class":1055,"line":1127},[1053,2763,2764],{"class":1207},"        \n",[1053,2766,2767,2769,2772],{"class":1055,"line":1133},[1053,2768,2490],{"class":1251},[1053,2770,2771],{"class":1207}," match",[1053,2773,1183],{"class":1182},[1053,2775,2776,2779,2781,2784,2786,2789,2791],{"class":1055,"line":1138},[1053,2777,2778],{"class":1207},"            new_path",[1053,2780,1270],{"class":1182},[1053,2782,2783],{"class":1207}," args",[1053,2785,1270],{"class":1182},[1053,2787,2788],{"class":1207}," kwargs ",[1053,2790,1379],{"class":1182},[1053,2792,2793],{"class":1207}," match\n",[1053,2795,2796,2799,2802,2804,2806,2808,2811],{"class":1055,"line":1144},[1053,2797,2798],{"class":1251},"            for",[1053,2800,2801],{"class":1207}," pattern ",[1053,2803,2446],{"class":1251},[1053,2805,1716],{"class":1417},[1053,2807,1421],{"class":1182},[1053,2809,2810],{"class":1424},"url_patterns",[1053,2812,1183],{"class":1182},[1053,2814,2815,2818],{"class":1055,"line":1283},[1053,2816,2817],{"class":1251},"                try",[1053,2819,1183],{"class":1182},[1053,2821,2822,2825,2827,2830,2832,2835,2837,2840],{"class":1055,"line":1289},[1053,2823,2824],{"class":1207},"                    sub_match ",[1053,2826,1379],{"class":1182},[1053,2828,2829],{"class":1207}," pattern",[1053,2831,1421],{"class":1182},[1053,2833,2834],{"class":1489},"resolve",[1053,2836,1220],{"class":1182},[1053,2838,2839],{"class":1489},"new_path",[1053,2841,1501],{"class":1182},[1053,2843,2844,2847,2850,2853,2856],{"class":1055,"line":1294},[1053,2845,2846],{"class":1251},"                except",[1053,2848,2849],{"class":1207}," Resolver404 ",[1053,2851,2852],{"class":1251},"as",[1053,2854,2855],{"class":1207}," e",[1053,2857,1183],{"class":1182},[1053,2859,2860,2863,2865,2868,2870,2873,2875,2878,2881,2885,2888,2890,2893,2895],{"class":1055,"line":1300},[1053,2861,2862],{"class":1207},"                    tried",[1053,2864,1421],{"class":1182},[1053,2866,2867],{"class":1489},"extend",[1053,2869,1220],{"class":1182},[1053,2871,2872],{"class":1489},"e",[1053,2874,1421],{"class":1182},[1053,2876,2877],{"class":1424},"args",[1053,2879,2880],{"class":1182},"[",[1053,2882,2884],{"class":2883},"s7CZa","0",[1053,2886,2887],{"class":1182},"][",[1053,2889,1865],{"class":1864},[1053,2891,2892],{"class":1868},"tried",[1053,2894,1865],{"class":1864},[1053,2896,2897],{"class":1182},"])\n",[1053,2899,2900,2903],{"class":1055,"line":1306},[1053,2901,2902],{"class":1251},"                else",[1053,2904,1183],{"class":1182},[1053,2906,2907,2910,2913],{"class":1055,"line":1312},[1053,2908,2909],{"class":1251},"                    if",[1053,2911,2912],{"class":1207}," sub_match",[1053,2914,1183],{"class":1182},[1053,2916,2917],{"class":1055,"line":2321},[1053,2918,2919],{"class":1059},"                        # Merge captured arguments\n",[1053,2921,2922,2925,2927,2930,2933,2936,2938,2940,2943,2945,2947],{"class":1055,"line":2326},[1053,2923,2924],{"class":1207},"                        sub_match_dict ",[1053,2926,1379],{"class":1182},[1053,2928,2929],{"class":1182}," {",[1053,2931,2932],{"class":1378},"**",[1053,2934,2935],{"class":1207},"kwargs",[1053,2937,1270],{"class":1182},[1053,2939,2304],{"class":1378},[1053,2941,2942],{"class":1207},"sub_match",[1053,2944,1421],{"class":1182},[1053,2946,2935],{"class":1424},[1053,2948,2949],{"class":1182},"}\n",[1053,2951,2952,2955,2958],{"class":1055,"line":2332},[1053,2953,2954],{"class":1251},"                        return",[1053,2956,2957],{"class":1489}," ResolverMatch",[1053,2959,2960],{"class":1182},"(\n",[1053,2962,2964,2967,2969,2972],{"class":1055,"line":2963},26,[1053,2965,2966],{"class":1489},"                            sub_match",[1053,2968,1421],{"class":1182},[1053,2970,2971],{"class":1424},"func",[1053,2973,1911],{"class":1182},[1053,2975,2977,2979,2981,2983],{"class":1055,"line":2976},27,[1053,2978,2966],{"class":1489},[1053,2980,1421],{"class":1182},[1053,2982,2877],{"class":1424},[1053,2984,1911],{"class":1182},[1053,2986,2988,2991],{"class":1055,"line":2987},28,[1053,2989,2990],{"class":1489},"                            sub_match_dict",[1053,2992,1911],{"class":1182},[1053,2994,2996,2998,3000,3003],{"class":1055,"line":2995},29,[1053,2997,2966],{"class":1489},[1053,2999,1421],{"class":1182},[1053,3001,3002],{"class":1424},"url_name",[1053,3004,1911],{"class":1182},[1053,3006,3008,3011,3013,3015,3018,3021,3024,3026,3028,3031],{"class":1055,"line":3007},30,[1053,3009,3010],{"class":1182},"                            [",[1053,3012,1224],{"class":1417},[1053,3014,1421],{"class":1182},[1053,3016,3017],{"class":1424},"app_name",[1053,3019,3020],{"class":1182},"]",[1053,3022,3023],{"class":1378}," +",[1053,3025,2912],{"class":1489},[1053,3027,1421],{"class":1182},[1053,3029,3030],{"class":1424},"app_names",[1053,3032,1911],{"class":1182},[1053,3034,3036,3038,3040,3042,3045,3047,3049,3051,3053,3056],{"class":1055,"line":3035},31,[1053,3037,3010],{"class":1182},[1053,3039,1224],{"class":1417},[1053,3041,1421],{"class":1182},[1053,3043,3044],{"class":1424},"namespace",[1053,3046,3020],{"class":1182},[1053,3048,3023],{"class":1378},[1053,3050,2912],{"class":1489},[1053,3052,1421],{"class":1182},[1053,3054,3055],{"class":1424},"namespaces",[1053,3057,1911],{"class":1182},[1053,3059,3061],{"class":1055,"line":3060},32,[1053,3062,3063],{"class":1182},"                        )\n",[1053,3065,3067],{"class":1055,"line":3066},33,[1053,3068,2764],{"class":1207},[1053,3070,3072,3075,3078,3081,3083,3085,3087,3090,3093,3095,3097,3099,3101,3103,3105],{"class":1055,"line":3071},34,[1053,3073,3074],{"class":1251},"        raise",[1053,3076,3077],{"class":1489}," Resolver404",[1053,3079,3080],{"class":1182},"({",[1053,3082,1865],{"class":1864},[1053,3084,2892],{"class":1868},[1053,3086,1865],{"class":1864},[1053,3088,3089],{"class":1182},":",[1053,3091,3092],{"class":1489}," tried",[1053,3094,1270],{"class":1182},[1053,3096,2578],{"class":1864},[1053,3098,2757],{"class":1868},[1053,3100,1865],{"class":1864},[1053,3102,3089],{"class":1182},[1053,3104,2709],{"class":1489},[1053,3106,3107],{"class":1182},"})\n",[1030,3109,3111],{"id":3110},"djangos-source-code-structure","Django's Source Code Structure",[1043,3113,3118],{"className":3114,"code":3116,"language":3117},[3115],"language-text","django/\n├── apps/              # Application registry\n├── conf/              # Global settings\n│   └── urls/          # Default URL patterns\n├── contrib/           # \"Batteries included\" apps\n│   ├── admin/\n│   ├── auth/\n│   ├── contenttypes/\n│   ├── sessions/\n│   ├── messages/\n│   ├── staticfiles/\n│   └── ...\n├── core/              # Core functionality\n│   ├── cache/\n│   ├── checks/\n│   ├── files/\n│   ├── handlers/\n│   ├── mail/\n│   ├── management/\n│   ├── serializers/\n│   └── validators/\n├── db/                # Database layer\n│   ├── backends/      # Database adapters\n│   ├── migrations/\n│   └── models/\n├── dispatch/          # Signal system\n├── forms/             # Form handling\n├── http/              # HTTP request/response\n├── middleware/        # Built-in middleware\n├── template/          # Template engine\n│   ├── backends/\n│   └── loaders/\n├── test/              # Testing framework\n├── urls/              # URL routing\n├── utils/             # Utility functions\n└── views/             # Generic views\n","text",[1050,3119,3116],{"__ignoreMap":1048},[1030,3121,3123],{"id":3122},"contributing-to-django","Contributing to Django",[1035,3125,3127],{"id":3126},"getting-started","Getting Started",[1026,3129,3130],{},[1154,3131,3132],{},"1. Set Up Development Environment",[1043,3134,3138],{"className":3135,"code":3136,"language":3137,"meta":1048,"style":1048},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Fork Django on GitHub\n# Clone your fork\ngit clone https://github.com/YOUR_USERNAME/django.git\ncd django\n\n# Add upstream remote\ngit remote add upstream https://github.com/django/django.git\n\n# Create virtual environment\npython -m venv venv\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\n\n# Install in editable mode\npip install -e .\n\n# Install development dependencies\npip install -r tests/requirements/py3.txt\n","bash",[1050,3139,3140,3145,3150,3162,3170,3176,3181,3197,3201,3206,3220,3231,3235,3240,3254,3258,3263],{"__ignoreMap":1048},[1053,3141,3142],{"class":1055,"line":1056},[1053,3143,3144],{"class":1059},"# Fork Django on GitHub\n",[1053,3146,3147],{"class":1055,"line":1063},[1053,3148,3149],{"class":1059},"# Clone your fork\n",[1053,3151,3152,3156,3159],{"class":1055,"line":1070},[1053,3153,3155],{"class":3154},"sYn-s","git",[1053,3157,3158],{"class":1868}," clone",[1053,3160,3161],{"class":1868}," https://github.com/YOUR_USERNAME/django.git\n",[1053,3163,3164,3167],{"class":1055,"line":1077},[1053,3165,3166],{"class":1365},"cd",[1053,3168,3169],{"class":1868}," django\n",[1053,3171,3172],{"class":1055,"line":1083},[1053,3173,3175],{"emptyLinePlaceholder":3174},true,"\n",[1053,3177,3178],{"class":1055,"line":1089},[1053,3179,3180],{"class":1059},"# Add upstream remote\n",[1053,3182,3183,3185,3188,3191,3194],{"class":1055,"line":1094},[1053,3184,3155],{"class":3154},[1053,3186,3187],{"class":1868}," remote",[1053,3189,3190],{"class":1868}," add",[1053,3192,3193],{"class":1868}," upstream",[1053,3195,3196],{"class":1868}," https://github.com/django/django.git\n",[1053,3198,3199],{"class":1055,"line":1100},[1053,3200,3175],{"emptyLinePlaceholder":3174},[1053,3202,3203],{"class":1055,"line":1105},[1053,3204,3205],{"class":1059},"# Create virtual environment\n",[1053,3207,3208,3210,3214,3217],{"class":1055,"line":1111},[1053,3209,1047],{"class":3154},[1053,3211,3213],{"class":3212},"sz9Cv"," -m",[1053,3215,3216],{"class":1868}," venv",[1053,3218,3219],{"class":1868}," venv\n",[1053,3221,3222,3225,3228],{"class":1055,"line":1116},[1053,3223,3224],{"class":1365},"source",[1053,3226,3227],{"class":1868}," venv/bin/activate",[1053,3229,3230],{"class":1059},"  # On Windows: venv\\Scripts\\activate\n",[1053,3232,3233],{"class":1055,"line":1122},[1053,3234,3175],{"emptyLinePlaceholder":3174},[1053,3236,3237],{"class":1055,"line":1127},[1053,3238,3239],{"class":1059},"# Install in editable mode\n",[1053,3241,3242,3245,3248,3251],{"class":1055,"line":1133},[1053,3243,3244],{"class":3154},"pip",[1053,3246,3247],{"class":1868}," install",[1053,3249,3250],{"class":3212}," -e",[1053,3252,3253],{"class":1868}," .\n",[1053,3255,3256],{"class":1055,"line":1138},[1053,3257,3175],{"emptyLinePlaceholder":3174},[1053,3259,3260],{"class":1055,"line":1144},[1053,3261,3262],{"class":1059},"# Install development dependencies\n",[1053,3264,3265,3267,3269,3272],{"class":1055,"line":1283},[1053,3266,3244],{"class":3154},[1053,3268,3247],{"class":1868},[1053,3270,3271],{"class":3212}," -r",[1053,3273,3274],{"class":1868}," tests/requirements/py3.txt\n",[1026,3276,3277],{},[1154,3278,3279],{},"2. Run Django's Test Suite",[1043,3281,3283],{"className":3135,"code":3282,"language":3137,"meta":1048,"style":1048},"# Run all tests (takes a while!)\n./runtests.py\n\n# Run specific test module\n./runtests.py admin_views\n\n# Run specific test class\n./runtests.py admin_views.AdminViewBasicTest\n\n# Run specific test method\n./runtests.py admin_views.AdminViewBasicTest.test_login\n\n# Run tests with coverage\ncoverage run ./runtests.py admin_views\ncoverage report\n\n# Run tests for specific database\n./runtests.py --settings=test_sqlite\n./runtests.py --settings=test_postgres\n",[1050,3284,3285,3290,3295,3299,3304,3312,3316,3321,3328,3332,3337,3344,3348,3353,3366,3373,3377,3382,3389],{"__ignoreMap":1048},[1053,3286,3287],{"class":1055,"line":1056},[1053,3288,3289],{"class":1059},"# Run all tests (takes a while!)\n",[1053,3291,3292],{"class":1055,"line":1063},[1053,3293,3294],{"class":3154},"./runtests.py\n",[1053,3296,3297],{"class":1055,"line":1070},[1053,3298,3175],{"emptyLinePlaceholder":3174},[1053,3300,3301],{"class":1055,"line":1077},[1053,3302,3303],{"class":1059},"# Run specific test module\n",[1053,3305,3306,3309],{"class":1055,"line":1083},[1053,3307,3308],{"class":3154},"./runtests.py",[1053,3310,3311],{"class":1868}," admin_views\n",[1053,3313,3314],{"class":1055,"line":1089},[1053,3315,3175],{"emptyLinePlaceholder":3174},[1053,3317,3318],{"class":1055,"line":1094},[1053,3319,3320],{"class":1059},"# Run specific test class\n",[1053,3322,3323,3325],{"class":1055,"line":1100},[1053,3324,3308],{"class":3154},[1053,3326,3327],{"class":1868}," admin_views.AdminViewBasicTest\n",[1053,3329,3330],{"class":1055,"line":1105},[1053,3331,3175],{"emptyLinePlaceholder":3174},[1053,3333,3334],{"class":1055,"line":1111},[1053,3335,3336],{"class":1059},"# Run specific test method\n",[1053,3338,3339,3341],{"class":1055,"line":1116},[1053,3340,3308],{"class":3154},[1053,3342,3343],{"class":1868}," admin_views.AdminViewBasicTest.test_login\n",[1053,3345,3346],{"class":1055,"line":1122},[1053,3347,3175],{"emptyLinePlaceholder":3174},[1053,3349,3350],{"class":1055,"line":1127},[1053,3351,3352],{"class":1059},"# Run tests with coverage\n",[1053,3354,3355,3358,3361,3364],{"class":1055,"line":1133},[1053,3356,3357],{"class":3154},"coverage",[1053,3359,3360],{"class":1868}," run",[1053,3362,3363],{"class":1868}," ./runtests.py",[1053,3365,3311],{"class":1868},[1053,3367,3368,3370],{"class":1055,"line":1138},[1053,3369,3357],{"class":3154},[1053,3371,3372],{"class":1868}," report\n",[1053,3374,3375],{"class":1055,"line":1144},[1053,3376,3175],{"emptyLinePlaceholder":3174},[1053,3378,3379],{"class":1055,"line":1283},[1053,3380,3381],{"class":1059},"# Run tests for specific database\n",[1053,3383,3384,3386],{"class":1055,"line":1289},[1053,3385,3308],{"class":3154},[1053,3387,3388],{"class":3212}," --settings=test_sqlite\n",[1053,3390,3391,3393],{"class":1055,"line":1294},[1053,3392,3308],{"class":3154},[1053,3394,3395],{"class":3212}," --settings=test_postgres\n",[1026,3397,3398],{},[1154,3399,3400],{},"3. Code Style",[1026,3402,3403],{},"Django follows PEP 8 with some modifications:",[1043,3405,3407],{"className":3135,"code":3406,"language":3137,"meta":1048,"style":1048},"# Install pre-commit hooks\npip install pre-commit\npre-commit install\n\n# Run linters\nflake8 django/\n\n# Format imports\nisort django/\n\n# Check for common issues\npython -m django check --deploy\n",[1050,3408,3409,3414,3423,3431,3435,3440,3448,3452,3457,3464,3468,3473],{"__ignoreMap":1048},[1053,3410,3411],{"class":1055,"line":1056},[1053,3412,3413],{"class":1059},"# Install pre-commit hooks\n",[1053,3415,3416,3418,3420],{"class":1055,"line":1063},[1053,3417,3244],{"class":3154},[1053,3419,3247],{"class":1868},[1053,3421,3422],{"class":1868}," pre-commit\n",[1053,3424,3425,3428],{"class":1055,"line":1070},[1053,3426,3427],{"class":3154},"pre-commit",[1053,3429,3430],{"class":1868}," install\n",[1053,3432,3433],{"class":1055,"line":1077},[1053,3434,3175],{"emptyLinePlaceholder":3174},[1053,3436,3437],{"class":1055,"line":1083},[1053,3438,3439],{"class":1059},"# Run linters\n",[1053,3441,3442,3445],{"class":1055,"line":1089},[1053,3443,3444],{"class":3154},"flake8",[1053,3446,3447],{"class":1868}," django/\n",[1053,3449,3450],{"class":1055,"line":1094},[1053,3451,3175],{"emptyLinePlaceholder":3174},[1053,3453,3454],{"class":1055,"line":1100},[1053,3455,3456],{"class":1059},"# Format imports\n",[1053,3458,3459,3462],{"class":1055,"line":1105},[1053,3460,3461],{"class":3154},"isort",[1053,3463,3447],{"class":1868},[1053,3465,3466],{"class":1055,"line":1111},[1053,3467,3175],{"emptyLinePlaceholder":3174},[1053,3469,3470],{"class":1055,"line":1116},[1053,3471,3472],{"class":1059},"# Check for common issues\n",[1053,3474,3475,3477,3479,3482,3485],{"class":1055,"line":1122},[1053,3476,1047],{"class":3154},[1053,3478,3213],{"class":3212},[1053,3480,3481],{"class":1868}," django",[1053,3483,3484],{"class":1868}," check",[1053,3486,3487],{"class":3212}," --deploy\n",[1035,3489,3491],{"id":3490},"contribution-workflow","Contribution Workflow",[1026,3493,3494],{},[1154,3495,3496],{},"1. Find an Issue",[3498,3499,3500,3511,3514,3517],"ul",{},[3501,3502,3503,3504],"li",{},"Browse ",[3505,3506,3510],"a",{"href":3507,"rel":3508},"https://code.djangoproject.com/",[3509],"nofollow","Django's Trac",[3501,3512,3513],{},"Look for \"Easy pickings\" tickets",[3501,3515,3516],{},"Check \"Accepted\" tickets ready for work",[3501,3518,3519],{},"Join #django-dev on IRC/Discord",[1026,3521,3522],{},[1154,3523,3524],{},"2. Create a Branch",[1043,3526,3528],{"className":3135,"code":3527,"language":3137,"meta":1048,"style":1048},"# Update your fork\ngit fetch upstream\ngit checkout main\ngit merge upstream/main\n\n# Create feature branch\ngit checkout -b ticket_12345\n",[1050,3529,3530,3535,3545,3555,3565,3569,3574],{"__ignoreMap":1048},[1053,3531,3532],{"class":1055,"line":1056},[1053,3533,3534],{"class":1059},"# Update your fork\n",[1053,3536,3537,3539,3542],{"class":1055,"line":1063},[1053,3538,3155],{"class":3154},[1053,3540,3541],{"class":1868}," fetch",[1053,3543,3544],{"class":1868}," upstream\n",[1053,3546,3547,3549,3552],{"class":1055,"line":1070},[1053,3548,3155],{"class":3154},[1053,3550,3551],{"class":1868}," checkout",[1053,3553,3554],{"class":1868}," main\n",[1053,3556,3557,3559,3562],{"class":1055,"line":1077},[1053,3558,3155],{"class":3154},[1053,3560,3561],{"class":1868}," merge",[1053,3563,3564],{"class":1868}," upstream/main\n",[1053,3566,3567],{"class":1055,"line":1083},[1053,3568,3175],{"emptyLinePlaceholder":3174},[1053,3570,3571],{"class":1055,"line":1089},[1053,3572,3573],{"class":1059},"# Create feature branch\n",[1053,3575,3576,3578,3580,3583],{"class":1055,"line":1094},[1053,3577,3155],{"class":3154},[1053,3579,3551],{"class":1868},[1053,3581,3582],{"class":3212}," -b",[1053,3584,3585],{"class":1868}," ticket_12345\n",[1026,3587,3588],{},[1154,3589,3590],{},"3. Make Changes",[1043,3592,3594],{"className":1045,"code":3593,"language":1047,"meta":1048,"style":1048},"# Example: Adding a new model field option\n# django/db/models/fields/__init__.py\n\nclass CharField(Field):\n    def __init__(self, *args, strip_whitespace=False, **kwargs):\n        self.strip_whitespace = strip_whitespace\n        super().__init__(*args, **kwargs)\n    \n    def get_prep_value(self, value):\n        value = super().get_prep_value(value)\n        if self.strip_whitespace and isinstance(value, str):\n            value = value.strip()\n        return value\n",[1050,3595,3596,3601,3606,3610,3624,3657,3671,3698,3702,3720,3742,3768,3784],{"__ignoreMap":1048},[1053,3597,3598],{"class":1055,"line":1056},[1053,3599,3600],{"class":1059},"# Example: Adding a new model field option\n",[1053,3602,3603],{"class":1055,"line":1063},[1053,3604,3605],{"class":1059},"# django/db/models/fields/__init__.py\n",[1053,3607,3608],{"class":1055,"line":1070},[1053,3609,3175],{"emptyLinePlaceholder":3174},[1053,3611,3612,3614,3617,3619,3622],{"class":1055,"line":1077},[1053,3613,1175],{"class":1174},[1053,3615,3616],{"class":1178}," CharField",[1053,3618,1220],{"class":1182},[1053,3620,3621],{"class":3154},"Field",[1053,3623,1227],{"class":1182},[1053,3625,3626,3628,3630,3632,3634,3636,3638,3640,3642,3645,3647,3649,3651,3653,3655],{"class":1055,"line":1083},[1053,3627,1213],{"class":1174},[1053,3629,1366],{"class":1365},[1053,3631,1220],{"class":1182},[1053,3633,1224],{"class":1223},[1053,3635,1270],{"class":1182},[1053,3637,2540],{"class":1378},[1053,3639,2877],{"class":1273},[1053,3641,1270],{"class":1182},[1053,3643,3644],{"class":1273}," strip_whitespace",[1053,3646,1379],{"class":1378},[1053,3648,1930],{"class":1382},[1053,3650,1270],{"class":1182},[1053,3652,2304],{"class":1378},[1053,3654,2935],{"class":1273},[1053,3656,1227],{"class":1182},[1053,3658,3659,3661,3663,3666,3668],{"class":1055,"line":1089},[1053,3660,1418],{"class":1417},[1053,3662,1421],{"class":1182},[1053,3664,3665],{"class":1424},"strip_whitespace",[1053,3667,1428],{"class":1182},[1053,3669,3670],{"class":1207}," strip_whitespace\n",[1053,3672,3673,3677,3680,3683,3685,3688,3690,3692,3694,3696],{"class":1055,"line":1094},[1053,3674,3676],{"class":3675},"sa2tF","        super",[1053,3678,3679],{"class":1182},"().",[1053,3681,3682],{"class":1365},"__init__",[1053,3684,1220],{"class":1182},[1053,3686,3687],{"class":1378},"*",[1053,3689,2877],{"class":1489},[1053,3691,1270],{"class":1182},[1053,3693,2304],{"class":1378},[1053,3695,2935],{"class":1489},[1053,3697,1501],{"class":1182},[1053,3699,3700],{"class":1055,"line":1100},[1053,3701,1208],{"class":1207},[1053,3703,3704,3706,3709,3711,3713,3715,3718],{"class":1055,"line":1105},[1053,3705,1213],{"class":1174},[1053,3707,3708],{"class":1216}," get_prep_value",[1053,3710,1220],{"class":1182},[1053,3712,1224],{"class":1223},[1053,3714,1270],{"class":1182},[1053,3716,3717],{"class":1273}," value",[1053,3719,1227],{"class":1182},[1053,3721,3722,3725,3727,3730,3732,3735,3737,3740],{"class":1055,"line":1111},[1053,3723,3724],{"class":1207},"        value ",[1053,3726,1379],{"class":1182},[1053,3728,3729],{"class":3675}," super",[1053,3731,3679],{"class":1182},[1053,3733,3734],{"class":1489},"get_prep_value",[1053,3736,1220],{"class":1182},[1053,3738,3739],{"class":1489},"value",[1053,3741,1501],{"class":1182},[1053,3743,3744,3746,3748,3750,3752,3754,3757,3759,3761,3763,3766],{"class":1055,"line":1116},[1053,3745,2490],{"class":1251},[1053,3747,1716],{"class":1417},[1053,3749,1421],{"class":1182},[1053,3751,3665],{"class":1424},[1053,3753,2588],{"class":1378},[1053,3755,3756],{"class":1365}," isinstance",[1053,3758,1220],{"class":1182},[1053,3760,3739],{"class":1489},[1053,3762,1270],{"class":1182},[1053,3764,3765],{"class":3675}," str",[1053,3767,1227],{"class":1182},[1053,3769,3770,3773,3775,3777,3779,3782],{"class":1055,"line":1122},[1053,3771,3772],{"class":1207},"            value ",[1053,3774,1379],{"class":1182},[1053,3776,3717],{"class":1207},[1053,3778,1421],{"class":1182},[1053,3780,3781],{"class":1489},"strip",[1053,3783,1724],{"class":1182},[1053,3785,3786,3788],{"class":1055,"line":1127},[1053,3787,1764],{"class":1251},[1053,3789,3790],{"class":1207}," value\n",[1026,3792,3793],{},[1154,3794,3795],{},"4. Write Tests",[1043,3797,3799],{"className":1045,"code":3798,"language":1047,"meta":1048,"style":1048},"# tests/model_fields/test_charfield.py\n\nclass CharFieldTests(TestCase):\n    def test_strip_whitespace(self):\n        \"\"\"\n        CharField with strip_whitespace=True removes leading/trailing spaces.\n        \"\"\"\n        class TestModel(models.Model):\n            name = models.CharField(max_length=100, strip_whitespace=True)\n            \n            class Meta:\n                app_label = 'model_fields'\n        \n        obj = TestModel(name='  John Doe  ')\n        obj.full_clean()\n        self.assertEqual(obj.name, 'John Doe')\n",[1050,3800,3801,3806,3810,3824,3837,3841,3846,3850,3870,3906,3911,3921,3936,3940,3965,3977],{"__ignoreMap":1048},[1053,3802,3803],{"class":1055,"line":1056},[1053,3804,3805],{"class":1059},"# tests/model_fields/test_charfield.py\n",[1053,3807,3808],{"class":1055,"line":1063},[1053,3809,3175],{"emptyLinePlaceholder":3174},[1053,3811,3812,3814,3817,3819,3822],{"class":1055,"line":1070},[1053,3813,1175],{"class":1174},[1053,3815,3816],{"class":1178}," CharFieldTests",[1053,3818,1220],{"class":1182},[1053,3820,3821],{"class":3154},"TestCase",[1053,3823,1227],{"class":1182},[1053,3825,3826,3828,3831,3833,3835],{"class":1055,"line":1077},[1053,3827,1213],{"class":1174},[1053,3829,3830],{"class":1216}," test_strip_whitespace",[1053,3832,1220],{"class":1182},[1053,3834,1224],{"class":1223},[1053,3836,1227],{"class":1182},[1053,3838,3839],{"class":1055,"line":1083},[1053,3840,1232],{"class":1066},[1053,3842,3843],{"class":1055,"line":1089},[1053,3844,3845],{"class":1073},"        CharField with strip_whitespace=True removes leading/trailing spaces.\n",[1053,3847,3848],{"class":1055,"line":1094},[1053,3849,1232],{"class":1066},[1053,3851,3852,3855,3858,3860,3863,3865,3868],{"class":1055,"line":1100},[1053,3853,3854],{"class":1174},"        class",[1053,3856,3857],{"class":1178}," TestModel",[1053,3859,1220],{"class":1182},[1053,3861,3862],{"class":3154},"models",[1053,3864,1421],{"class":1182},[1053,3866,3867],{"class":3154},"Model",[1053,3869,1227],{"class":1182},[1053,3871,3872,3875,3877,3880,3882,3885,3887,3891,3893,3896,3898,3900,3902,3904],{"class":1055,"line":1105},[1053,3873,3874],{"class":1207},"            name ",[1053,3876,1379],{"class":1182},[1053,3878,3879],{"class":1207}," models",[1053,3881,1421],{"class":1182},[1053,3883,3884],{"class":1489},"CharField",[1053,3886,1220],{"class":1182},[1053,3888,3890],{"class":3889},"sqOPj","max_length",[1053,3892,1379],{"class":1182},[1053,3894,3895],{"class":2883},"100",[1053,3897,1270],{"class":1182},[1053,3899,3644],{"class":3889},[1053,3901,1379],{"class":1182},[1053,3903,2247],{"class":1382},[1053,3905,1501],{"class":1182},[1053,3907,3908],{"class":1055,"line":1111},[1053,3909,3910],{"class":1207},"            \n",[1053,3912,3913,3916,3919],{"class":1055,"line":1116},[1053,3914,3915],{"class":1174},"            class",[1053,3917,3918],{"class":1178}," Meta",[1053,3920,1183],{"class":1182},[1053,3922,3923,3926,3928,3930,3933],{"class":1055,"line":1122},[1053,3924,3925],{"class":1207},"                app_label ",[1053,3927,1379],{"class":1182},[1053,3929,2578],{"class":1864},[1053,3931,3932],{"class":1868},"model_fields",[1053,3934,3935],{"class":1864},"'\n",[1053,3937,3938],{"class":1055,"line":1127},[1053,3939,2764],{"class":1207},[1053,3941,3942,3945,3947,3949,3951,3954,3956,3958,3961,3963],{"class":1055,"line":1133},[1053,3943,3944],{"class":1207},"        obj ",[1053,3946,1379],{"class":1182},[1053,3948,3857],{"class":1489},[1053,3950,1220],{"class":1182},[1053,3952,3953],{"class":3889},"name",[1053,3955,1379],{"class":1182},[1053,3957,1865],{"class":1864},[1053,3959,3960],{"class":1868},"  John Doe  ",[1053,3962,1865],{"class":1864},[1053,3964,1501],{"class":1182},[1053,3966,3967,3970,3972,3975],{"class":1055,"line":1138},[1053,3968,3969],{"class":1207},"        obj",[1053,3971,1421],{"class":1182},[1053,3973,3974],{"class":1489},"full_clean",[1053,3976,1724],{"class":1182},[1053,3978,3979,3981,3983,3986,3988,3991,3993,3995,3997,3999,4002,4004],{"class":1055,"line":1144},[1053,3980,1418],{"class":1417},[1053,3982,1421],{"class":1182},[1053,3984,3985],{"class":1489},"assertEqual",[1053,3987,1220],{"class":1182},[1053,3989,3990],{"class":1489},"obj",[1053,3992,1421],{"class":1182},[1053,3994,3953],{"class":1424},[1053,3996,1270],{"class":1182},[1053,3998,2578],{"class":1864},[1053,4000,4001],{"class":1868},"John Doe",[1053,4003,1865],{"class":1864},[1053,4005,1501],{"class":1182},[1026,4007,4008],{},[1154,4009,4010],{},"5. Update Documentation",[1043,4012,4016],{"className":4013,"code":4014,"language":4015,"meta":1048,"style":1048},"language-rst shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark",".. docs/ref/models/fields.txt\n\n``strip_whitespace``\n~~~~~~~~~~~~~~~~~~~~\n\n.. attribute:: CharField.strip_whitespace\n\nIf ``True``, leading and trailing whitespace will be removed from the value\nbefore saving. Defaults to ``False``.\n\nExample::\n\n    name = models.CharField(max_length=100, strip_whitespace=True)\n","rst",[1050,4017,4018,4023,4027,4032,4037,4041,4046,4050,4055,4060,4064,4069,4073],{"__ignoreMap":1048},[1053,4019,4020],{"class":1055,"line":1056},[1053,4021,4022],{},".. docs/ref/models/fields.txt\n",[1053,4024,4025],{"class":1055,"line":1063},[1053,4026,3175],{"emptyLinePlaceholder":3174},[1053,4028,4029],{"class":1055,"line":1070},[1053,4030,4031],{},"``strip_whitespace``\n",[1053,4033,4034],{"class":1055,"line":1077},[1053,4035,4036],{},"~~~~~~~~~~~~~~~~~~~~\n",[1053,4038,4039],{"class":1055,"line":1083},[1053,4040,3175],{"emptyLinePlaceholder":3174},[1053,4042,4043],{"class":1055,"line":1089},[1053,4044,4045],{},".. attribute:: CharField.strip_whitespace\n",[1053,4047,4048],{"class":1055,"line":1094},[1053,4049,3175],{"emptyLinePlaceholder":3174},[1053,4051,4052],{"class":1055,"line":1100},[1053,4053,4054],{},"If ``True``, leading and trailing whitespace will be removed from the value\n",[1053,4056,4057],{"class":1055,"line":1105},[1053,4058,4059],{},"before saving. Defaults to ``False``.\n",[1053,4061,4062],{"class":1055,"line":1111},[1053,4063,3175],{"emptyLinePlaceholder":3174},[1053,4065,4066],{"class":1055,"line":1116},[1053,4067,4068],{},"Example::\n",[1053,4070,4071],{"class":1055,"line":1122},[1053,4072,3175],{"emptyLinePlaceholder":3174},[1053,4074,4075],{"class":1055,"line":1127},[1053,4076,4077],{},"    name = models.CharField(max_length=100, strip_whitespace=True)\n",[1026,4079,4080],{},[1154,4081,4082],{},"6. Create Pull Request",[1043,4084,4086],{"className":3135,"code":4085,"language":3137,"meta":1048,"style":1048},"# Commit changes\ngit add .\ngit commit -m \"Fixed #12345 -- Added strip_whitespace option to CharField\"\n\n# Push to your fork\ngit push origin ticket_12345\n\n# Create PR on GitHub\n# Reference the Trac ticket in description\n",[1050,4087,4088,4093,4101,4119,4123,4128,4139,4143,4148],{"__ignoreMap":1048},[1053,4089,4090],{"class":1055,"line":1056},[1053,4091,4092],{"class":1059},"# Commit changes\n",[1053,4094,4095,4097,4099],{"class":1055,"line":1063},[1053,4096,3155],{"class":3154},[1053,4098,3190],{"class":1868},[1053,4100,3253],{"class":1868},[1053,4102,4103,4105,4108,4110,4113,4116],{"class":1055,"line":1070},[1053,4104,3155],{"class":3154},[1053,4106,4107],{"class":1868}," commit",[1053,4109,3213],{"class":3212},[1053,4111,4112],{"class":1864}," \"",[1053,4114,4115],{"class":1868},"Fixed #12345 -- Added strip_whitespace option to CharField",[1053,4117,4118],{"class":1864},"\"\n",[1053,4120,4121],{"class":1055,"line":1077},[1053,4122,3175],{"emptyLinePlaceholder":3174},[1053,4124,4125],{"class":1055,"line":1083},[1053,4126,4127],{"class":1059},"# Push to your fork\n",[1053,4129,4130,4132,4135,4137],{"class":1055,"line":1089},[1053,4131,3155],{"class":3154},[1053,4133,4134],{"class":1868}," push",[1053,4136,1673],{"class":1868},[1053,4138,3585],{"class":1868},[1053,4140,4141],{"class":1055,"line":1094},[1053,4142,3175],{"emptyLinePlaceholder":3174},[1053,4144,4145],{"class":1055,"line":1100},[1053,4146,4147],{"class":1059},"# Create PR on GitHub\n",[1053,4149,4150],{"class":1055,"line":1105},[1053,4151,4152],{"class":1059},"# Reference the Trac ticket in description\n",[1035,4154,4156],{"id":4155},"contribution-guidelines","Contribution Guidelines",[1026,4158,4159],{},[1154,4160,4161],{},"Commit Messages",[1043,4163,4165],{"className":3135,"code":4164,"language":3137,"meta":1048,"style":1048},"# Format: Fixed #ticket -- Short description\ngit commit -m \"Fixed #12345 -- Added strip_whitespace option to CharField\"\n\n# For new features\ngit commit -m \"Added support for PostgreSQL range fields\"\n\n# For documentation\ngit commit -m \"Docs -- Clarified QuerySet.select_related() behavior\"\n\n# For tests\ngit commit -m \"Tests -- Added coverage for Model.save() with update_fields\"\n",[1050,4166,4167,4172,4186,4190,4195,4210,4214,4219,4234,4238,4243],{"__ignoreMap":1048},[1053,4168,4169],{"class":1055,"line":1056},[1053,4170,4171],{"class":1059},"# Format: Fixed #ticket -- Short description\n",[1053,4173,4174,4176,4178,4180,4182,4184],{"class":1055,"line":1063},[1053,4175,3155],{"class":3154},[1053,4177,4107],{"class":1868},[1053,4179,3213],{"class":3212},[1053,4181,4112],{"class":1864},[1053,4183,4115],{"class":1868},[1053,4185,4118],{"class":1864},[1053,4187,4188],{"class":1055,"line":1070},[1053,4189,3175],{"emptyLinePlaceholder":3174},[1053,4191,4192],{"class":1055,"line":1077},[1053,4193,4194],{"class":1059},"# For new features\n",[1053,4196,4197,4199,4201,4203,4205,4208],{"class":1055,"line":1083},[1053,4198,3155],{"class":3154},[1053,4200,4107],{"class":1868},[1053,4202,3213],{"class":3212},[1053,4204,4112],{"class":1864},[1053,4206,4207],{"class":1868},"Added support for PostgreSQL range fields",[1053,4209,4118],{"class":1864},[1053,4211,4212],{"class":1055,"line":1089},[1053,4213,3175],{"emptyLinePlaceholder":3174},[1053,4215,4216],{"class":1055,"line":1094},[1053,4217,4218],{"class":1059},"# For documentation\n",[1053,4220,4221,4223,4225,4227,4229,4232],{"class":1055,"line":1100},[1053,4222,3155],{"class":3154},[1053,4224,4107],{"class":1868},[1053,4226,3213],{"class":3212},[1053,4228,4112],{"class":1864},[1053,4230,4231],{"class":1868},"Docs -- Clarified QuerySet.select_related() behavior",[1053,4233,4118],{"class":1864},[1053,4235,4236],{"class":1055,"line":1105},[1053,4237,3175],{"emptyLinePlaceholder":3174},[1053,4239,4240],{"class":1055,"line":1111},[1053,4241,4242],{"class":1059},"# For tests\n",[1053,4244,4245,4247,4249,4251,4253,4256],{"class":1055,"line":1116},[1053,4246,3155],{"class":3154},[1053,4248,4107],{"class":1868},[1053,4250,3213],{"class":3212},[1053,4252,4112],{"class":1864},[1053,4254,4255],{"class":1868},"Tests -- Added coverage for Model.save() with update_fields",[1053,4257,4118],{"class":1864},[1026,4259,4260],{},[1154,4261,4262],{},"Code Quality",[1043,4264,4266],{"className":1045,"code":4265,"language":1047,"meta":1048,"style":1048},"# Good: Clear, documented, tested\nclass MyFeature:\n    \"\"\"\n    Brief description of the feature.\n    \n    Detailed explanation of how it works and why.\n    \"\"\"\n    \n    def process(self, data):\n        \"\"\"\n        Process the given data.\n        \n        Args:\n            data: The data to process\n            \n        Returns:\n            Processed data\n            \n        Raises:\n            ValueError: If data is invalid\n        \"\"\"\n        if not data:\n            raise ValueError(\"Data cannot be empty\")\n        return self._transform(data)\n\n# Bad: Unclear, undocumented\nclass MyFeature:\n    def process(self, data):\n        return self._transform(data)\n",[1050,4267,4268,4273,4282,4286,4291,4295,4300,4304,4308,4325,4329,4334,4338,4343,4348,4352,4357,4362,4366,4371,4376,4380,4390,4410,4427,4431,4436,4444,4460],{"__ignoreMap":1048},[1053,4269,4270],{"class":1055,"line":1056},[1053,4271,4272],{"class":1059},"# Good: Clear, documented, tested\n",[1053,4274,4275,4277,4280],{"class":1055,"line":1063},[1053,4276,1175],{"class":1174},[1053,4278,4279],{"class":1178}," MyFeature",[1053,4281,1183],{"class":1182},[1053,4283,4284],{"class":1055,"line":1070},[1053,4285,1188],{"class":1066},[1053,4287,4288],{"class":1055,"line":1077},[1053,4289,4290],{"class":1073},"    Brief description of the feature.\n",[1053,4292,4293],{"class":1055,"line":1083},[1053,4294,1208],{"class":1073},[1053,4296,4297],{"class":1055,"line":1089},[1053,4298,4299],{"class":1073},"    Detailed explanation of how it works and why.\n",[1053,4301,4302],{"class":1055,"line":1094},[1053,4303,1188],{"class":1066},[1053,4305,4306],{"class":1055,"line":1100},[1053,4307,1208],{"class":1207},[1053,4309,4310,4312,4315,4317,4319,4321,4323],{"class":1055,"line":1105},[1053,4311,1213],{"class":1174},[1053,4313,4314],{"class":1216}," process",[1053,4316,1220],{"class":1182},[1053,4318,1224],{"class":1223},[1053,4320,1270],{"class":1182},[1053,4322,1841],{"class":1273},[1053,4324,1227],{"class":1182},[1053,4326,4327],{"class":1055,"line":1111},[1053,4328,1232],{"class":1066},[1053,4330,4331],{"class":1055,"line":1116},[1053,4332,4333],{"class":1073},"        Process the given data.\n",[1053,4335,4336],{"class":1055,"line":1122},[1053,4337,2764],{"class":1073},[1053,4339,4340],{"class":1055,"line":1127},[1053,4341,4342],{"class":1073},"        Args:\n",[1053,4344,4345],{"class":1055,"line":1133},[1053,4346,4347],{"class":1073},"            data: The data to process\n",[1053,4349,4350],{"class":1055,"line":1138},[1053,4351,3910],{"class":1073},[1053,4353,4354],{"class":1055,"line":1144},[1053,4355,4356],{"class":1073},"        Returns:\n",[1053,4358,4359],{"class":1055,"line":1283},[1053,4360,4361],{"class":1073},"            Processed data\n",[1053,4363,4364],{"class":1055,"line":1289},[1053,4365,3910],{"class":1073},[1053,4367,4368],{"class":1055,"line":1294},[1053,4369,4370],{"class":1073},"        Raises:\n",[1053,4372,4373],{"class":1055,"line":1300},[1053,4374,4375],{"class":1073},"            ValueError: If data is invalid\n",[1053,4377,4378],{"class":1055,"line":1306},[1053,4379,1232],{"class":1066},[1053,4381,4382,4384,4386,4388],{"class":1055,"line":1312},[1053,4383,2490],{"class":1251},[1053,4385,1992],{"class":1378},[1053,4387,1841],{"class":1207},[1053,4389,1183],{"class":1182},[1053,4391,4392,4395,4398,4400,4403,4406,4408],{"class":1055,"line":2321},[1053,4393,4394],{"class":1251},"            raise",[1053,4396,4397],{"class":3675}," ValueError",[1053,4399,1220],{"class":1182},[1053,4401,4402],{"class":1864},"\"",[1053,4404,4405],{"class":1868},"Data cannot be empty",[1053,4407,4402],{"class":1864},[1053,4409,1501],{"class":1182},[1053,4411,4412,4414,4416,4418,4421,4423,4425],{"class":1055,"line":2326},[1053,4413,1764],{"class":1251},[1053,4415,1716],{"class":1417},[1053,4417,1421],{"class":1182},[1053,4419,4420],{"class":1489},"_transform",[1053,4422,1220],{"class":1182},[1053,4424,2016],{"class":1489},[1053,4426,1501],{"class":1182},[1053,4428,4429],{"class":1055,"line":2332},[1053,4430,3175],{"emptyLinePlaceholder":3174},[1053,4432,4433],{"class":1055,"line":2963},[1053,4434,4435],{"class":1059},"# Bad: Unclear, undocumented\n",[1053,4437,4438,4440,4442],{"class":1055,"line":2976},[1053,4439,1175],{"class":1174},[1053,4441,4279],{"class":1178},[1053,4443,1183],{"class":1182},[1053,4445,4446,4448,4450,4452,4454,4456,4458],{"class":1055,"line":2987},[1053,4447,1213],{"class":1174},[1053,4449,4314],{"class":1216},[1053,4451,1220],{"class":1182},[1053,4453,1224],{"class":1223},[1053,4455,1270],{"class":1182},[1053,4457,1841],{"class":1273},[1053,4459,1227],{"class":1182},[1053,4461,4462,4464,4466,4468,4470,4472,4474],{"class":1055,"line":2995},[1053,4463,1764],{"class":1251},[1053,4465,1716],{"class":1417},[1053,4467,1421],{"class":1182},[1053,4469,4420],{"class":1489},[1053,4471,1220],{"class":1182},[1053,4473,2016],{"class":1489},[1053,4475,1501],{"class":1182},[1026,4477,4478],{},[1154,4479,4480],{},"Backwards Compatibility",[1043,4482,4484],{"className":1045,"code":4483,"language":1047,"meta":1048,"style":1048},"# Good: Maintains backwards compatibility\ndef my_function(arg1, arg2=None, new_arg=None):\n    \"\"\"\n    New parameter added with default value.\n    \"\"\"\n    if new_arg is None:\n        new_arg = 'default'\n    # Implementation\n\n# Bad: Breaks existing code\ndef my_function(arg1, new_arg, arg2=None):\n    \"\"\"\n    New required parameter breaks existing calls.\n    \"\"\"\n    pass\n",[1050,4485,4486,4491,4523,4527,4532,4536,4549,4563,4568,4572,4577,4601,4605,4610,4614],{"__ignoreMap":1048},[1053,4487,4488],{"class":1055,"line":1056},[1053,4489,4490],{"class":1059},"# Good: Maintains backwards compatibility\n",[1053,4492,4493,4495,4498,4500,4503,4505,4508,4510,4512,4514,4517,4519,4521],{"class":1055,"line":1063},[1053,4494,2355],{"class":1174},[1053,4496,4497],{"class":1216}," my_function",[1053,4499,1220],{"class":1182},[1053,4501,4502],{"class":1273},"arg1",[1053,4504,1270],{"class":1182},[1053,4506,4507],{"class":1273}," arg2",[1053,4509,1379],{"class":1378},[1053,4511,1383],{"class":1382},[1053,4513,1270],{"class":1182},[1053,4515,4516],{"class":1273}," new_arg",[1053,4518,1379],{"class":1378},[1053,4520,1383],{"class":1382},[1053,4522,1227],{"class":1182},[1053,4524,4525],{"class":1055,"line":1070},[1053,4526,1188],{"class":1066},[1053,4528,4529],{"class":1055,"line":1077},[1053,4530,4531],{"class":1073},"    New parameter added with default value.\n",[1053,4533,4534],{"class":1055,"line":1083},[1053,4535,1188],{"class":1066},[1053,4537,4538,4540,4543,4545,4547],{"class":1055,"line":1089},[1053,4539,2509],{"class":1251},[1053,4541,4542],{"class":1207}," new_arg ",[1053,4544,1989],{"class":1378},[1053,4546,1995],{"class":1382},[1053,4548,1183],{"class":1182},[1053,4550,4551,4554,4556,4558,4561],{"class":1055,"line":1094},[1053,4552,4553],{"class":1207},"        new_arg ",[1053,4555,1379],{"class":1182},[1053,4557,2578],{"class":1864},[1053,4559,4560],{"class":1868},"default",[1053,4562,3935],{"class":1864},[1053,4564,4565],{"class":1055,"line":1100},[1053,4566,4567],{"class":1059},"    # Implementation\n",[1053,4569,4570],{"class":1055,"line":1105},[1053,4571,3175],{"emptyLinePlaceholder":3174},[1053,4573,4574],{"class":1055,"line":1111},[1053,4575,4576],{"class":1059},"# Bad: Breaks existing code\n",[1053,4578,4579,4581,4583,4585,4587,4589,4591,4593,4595,4597,4599],{"class":1055,"line":1116},[1053,4580,2355],{"class":1174},[1053,4582,4497],{"class":1216},[1053,4584,1220],{"class":1182},[1053,4586,4502],{"class":1273},[1053,4588,1270],{"class":1182},[1053,4590,4516],{"class":1273},[1053,4592,1270],{"class":1182},[1053,4594,4507],{"class":1273},[1053,4596,1379],{"class":1378},[1053,4598,1383],{"class":1382},[1053,4600,1227],{"class":1182},[1053,4602,4603],{"class":1055,"line":1122},[1053,4604,1188],{"class":1066},[1053,4606,4607],{"class":1055,"line":1127},[1053,4608,4609],{"class":1073},"    New required parameter breaks existing calls.\n",[1053,4611,4612],{"class":1055,"line":1133},[1053,4613,1188],{"class":1066},[1053,4615,4616],{"class":1055,"line":1138},[1053,4617,4618],{"class":1251},"    pass\n",[1035,4620,4622],{"id":4621},"types-of-contributions","Types of Contributions",[1026,4624,4625],{},[1154,4626,4627],{},"1. Bug Fixes",[1043,4629,4631],{"className":1045,"code":4630,"language":1047,"meta":1048,"style":1048},"# Before: Bug in QuerySet.distinct()\ndef distinct(self, *field_names):\n    if field_names:\n        # Bug: Doesn't validate field names\n        return self._clone()\n\n# After: Fixed validation\ndef distinct(self, *field_names):\n    if field_names:\n        # Validate field names exist\n        self._validate_field_names(field_names)\n        return self._clone()\n",[1050,4632,4633,4638,4658,4667,4672,4685,4689,4694,4712,4720,4725,4740],{"__ignoreMap":1048},[1053,4634,4635],{"class":1055,"line":1056},[1053,4636,4637],{"class":1059},"# Before: Bug in QuerySet.distinct()\n",[1053,4639,4640,4642,4645,4647,4649,4651,4653,4656],{"class":1055,"line":1063},[1053,4641,2355],{"class":1174},[1053,4643,4644],{"class":1216}," distinct",[1053,4646,1220],{"class":1182},[1053,4648,1224],{"class":1223},[1053,4650,1270],{"class":1182},[1053,4652,2540],{"class":1378},[1053,4654,4655],{"class":1273},"field_names",[1053,4657,1227],{"class":1182},[1053,4659,4660,4662,4665],{"class":1055,"line":1070},[1053,4661,2509],{"class":1251},[1053,4663,4664],{"class":1207}," field_names",[1053,4666,1183],{"class":1182},[1053,4668,4669],{"class":1055,"line":1077},[1053,4670,4671],{"class":1059},"        # Bug: Doesn't validate field names\n",[1053,4673,4674,4676,4678,4680,4683],{"class":1055,"line":1083},[1053,4675,1764],{"class":1251},[1053,4677,1716],{"class":1417},[1053,4679,1421],{"class":1182},[1053,4681,4682],{"class":1489},"_clone",[1053,4684,1724],{"class":1182},[1053,4686,4687],{"class":1055,"line":1089},[1053,4688,3175],{"emptyLinePlaceholder":3174},[1053,4690,4691],{"class":1055,"line":1094},[1053,4692,4693],{"class":1059},"# After: Fixed validation\n",[1053,4695,4696,4698,4700,4702,4704,4706,4708,4710],{"class":1055,"line":1100},[1053,4697,2355],{"class":1174},[1053,4699,4644],{"class":1216},[1053,4701,1220],{"class":1182},[1053,4703,1224],{"class":1223},[1053,4705,1270],{"class":1182},[1053,4707,2540],{"class":1378},[1053,4709,4655],{"class":1273},[1053,4711,1227],{"class":1182},[1053,4713,4714,4716,4718],{"class":1055,"line":1105},[1053,4715,2509],{"class":1251},[1053,4717,4664],{"class":1207},[1053,4719,1183],{"class":1182},[1053,4721,4722],{"class":1055,"line":1111},[1053,4723,4724],{"class":1059},"        # Validate field names exist\n",[1053,4726,4727,4729,4731,4734,4736,4738],{"class":1055,"line":1116},[1053,4728,1418],{"class":1417},[1053,4730,1421],{"class":1182},[1053,4732,4733],{"class":1489},"_validate_field_names",[1053,4735,1220],{"class":1182},[1053,4737,4655],{"class":1489},[1053,4739,1501],{"class":1182},[1053,4741,4742,4744,4746,4748,4750],{"class":1055,"line":1122},[1053,4743,1764],{"class":1251},[1053,4745,1716],{"class":1417},[1053,4747,1421],{"class":1182},[1053,4749,4682],{"class":1489},[1053,4751,1724],{"class":1182},[1026,4753,4754],{},[1154,4755,4756],{},"2. New Features",[1043,4758,4760],{"className":1045,"code":4759,"language":1047,"meta":1048,"style":1048},"# Adding JSONField support for SQLite\n# django/db/backends/sqlite3/features.py\n\nclass DatabaseFeatures(BaseDatabaseFeatures):\n    supports_json_field = True  # New in SQLite 3.38+\n    \n    @cached_property\n    def supports_json_field_contains(self):\n        return self.connection.sqlite_version_info >= (3, 38, 0)\n",[1050,4761,4762,4767,4772,4776,4790,4803,4807,4815,4828],{"__ignoreMap":1048},[1053,4763,4764],{"class":1055,"line":1056},[1053,4765,4766],{"class":1059},"# Adding JSONField support for SQLite\n",[1053,4768,4769],{"class":1055,"line":1063},[1053,4770,4771],{"class":1059},"# django/db/backends/sqlite3/features.py\n",[1053,4773,4774],{"class":1055,"line":1070},[1053,4775,3175],{"emptyLinePlaceholder":3174},[1053,4777,4778,4780,4783,4785,4788],{"class":1055,"line":1077},[1053,4779,1175],{"class":1174},[1053,4781,4782],{"class":1178}," DatabaseFeatures",[1053,4784,1220],{"class":1182},[1053,4786,4787],{"class":3154},"BaseDatabaseFeatures",[1053,4789,1227],{"class":1182},[1053,4791,4792,4795,4797,4800],{"class":1055,"line":1083},[1053,4793,4794],{"class":1207},"    supports_json_field ",[1053,4796,1379],{"class":1182},[1053,4798,4799],{"class":1382}," True",[1053,4801,4802],{"class":1059},"  # New in SQLite 3.38+\n",[1053,4804,4805],{"class":1055,"line":1089},[1053,4806,1208],{"class":1207},[1053,4808,4809,4812],{"class":1055,"line":1094},[1053,4810,4811],{"class":1182},"    @",[1053,4813,4814],{"class":1216},"cached_property\n",[1053,4816,4817,4819,4822,4824,4826],{"class":1055,"line":1100},[1053,4818,1213],{"class":1174},[1053,4820,4821],{"class":1216}," supports_json_field_contains",[1053,4823,1220],{"class":1182},[1053,4825,1224],{"class":1223},[1053,4827,1227],{"class":1182},[1053,4829,4830,4832,4834,4836,4839,4841,4844,4847,4850,4853,4855,4858,4860,4863],{"class":1055,"line":1105},[1053,4831,1764],{"class":1251},[1053,4833,1716],{"class":1417},[1053,4835,1421],{"class":1182},[1053,4837,4838],{"class":1424},"connection",[1053,4840,1421],{"class":1182},[1053,4842,4843],{"class":1424},"sqlite_version_info",[1053,4845,4846],{"class":1378}," >=",[1053,4848,4849],{"class":1182}," (",[1053,4851,4852],{"class":2883},"3",[1053,4854,1270],{"class":1182},[1053,4856,4857],{"class":2883}," 38",[1053,4859,1270],{"class":1182},[1053,4861,4862],{"class":2883}," 0",[1053,4864,1501],{"class":1182},[1026,4866,4867],{},[1154,4868,4869],{},"3. Performance Improvements",[1043,4871,4873],{"className":1045,"code":4872,"language":1047,"meta":1048,"style":1048},"# Before: N+1 query problem\ndef get_articles_with_authors():\n    articles = Article.objects.all()\n    for article in articles:\n        print(article.author.name)  # Queries for each article\n\n# After: Optimized with select_related\ndef get_articles_with_authors():\n    articles = Article.objects.select_related('author')\n    for article in articles:\n        print(article.author.name)  # Single query\n",[1050,4874,4875,4880,4890,4912,4926,4950,4954,4959,4967,4994,5006],{"__ignoreMap":1048},[1053,4876,4877],{"class":1055,"line":1056},[1053,4878,4879],{"class":1059},"# Before: N+1 query problem\n",[1053,4881,4882,4884,4887],{"class":1055,"line":1063},[1053,4883,2355],{"class":1174},[1053,4885,4886],{"class":1216}," get_articles_with_authors",[1053,4888,4889],{"class":1182},"():\n",[1053,4891,4892,4895,4897,4900,4902,4905,4907,4910],{"class":1055,"line":1070},[1053,4893,4894],{"class":1207},"    articles ",[1053,4896,1379],{"class":1182},[1053,4898,4899],{"class":1207}," Article",[1053,4901,1421],{"class":1182},[1053,4903,4904],{"class":1424},"objects",[1053,4906,1421],{"class":1182},[1053,4908,4909],{"class":1489},"all",[1053,4911,1724],{"class":1182},[1053,4913,4914,4916,4919,4921,4924],{"class":1055,"line":1077},[1053,4915,2440],{"class":1251},[1053,4917,4918],{"class":1207}," article ",[1053,4920,2446],{"class":1251},[1053,4922,4923],{"class":1207}," articles",[1053,4925,1183],{"class":1182},[1053,4927,4928,4931,4933,4936,4938,4941,4943,4945,4947],{"class":1055,"line":1083},[1053,4929,4930],{"class":1365},"        print",[1053,4932,1220],{"class":1182},[1053,4934,4935],{"class":1489},"article",[1053,4937,1421],{"class":1182},[1053,4939,4940],{"class":1424},"author",[1053,4942,1421],{"class":1182},[1053,4944,3953],{"class":1424},[1053,4946,2585],{"class":1182},[1053,4948,4949],{"class":1059},"  # Queries for each article\n",[1053,4951,4952],{"class":1055,"line":1089},[1053,4953,3175],{"emptyLinePlaceholder":3174},[1053,4955,4956],{"class":1055,"line":1094},[1053,4957,4958],{"class":1059},"# After: Optimized with select_related\n",[1053,4960,4961,4963,4965],{"class":1055,"line":1100},[1053,4962,2355],{"class":1174},[1053,4964,4886],{"class":1216},[1053,4966,4889],{"class":1182},[1053,4968,4969,4971,4973,4975,4977,4979,4981,4984,4986,4988,4990,4992],{"class":1055,"line":1105},[1053,4970,4894],{"class":1207},[1053,4972,1379],{"class":1182},[1053,4974,4899],{"class":1207},[1053,4976,1421],{"class":1182},[1053,4978,4904],{"class":1424},[1053,4980,1421],{"class":1182},[1053,4982,4983],{"class":1489},"select_related",[1053,4985,1220],{"class":1182},[1053,4987,1865],{"class":1864},[1053,4989,4940],{"class":1868},[1053,4991,1865],{"class":1864},[1053,4993,1501],{"class":1182},[1053,4995,4996,4998,5000,5002,5004],{"class":1055,"line":1111},[1053,4997,2440],{"class":1251},[1053,4999,4918],{"class":1207},[1053,5001,2446],{"class":1251},[1053,5003,4923],{"class":1207},[1053,5005,1183],{"class":1182},[1053,5007,5008,5010,5012,5014,5016,5018,5020,5022,5024],{"class":1055,"line":1116},[1053,5009,4930],{"class":1365},[1053,5011,1220],{"class":1182},[1053,5013,4935],{"class":1489},[1053,5015,1421],{"class":1182},[1053,5017,4940],{"class":1424},[1053,5019,1421],{"class":1182},[1053,5021,3953],{"class":1424},[1053,5023,2585],{"class":1182},[1053,5025,5026],{"class":1059},"  # Single query\n",[1026,5028,5029],{},[1154,5030,5031],{},"4. Documentation",[1043,5033,5035],{"className":4013,"code":5034,"language":4015,"meta":1048,"style":1048},".. docs/topics/db/queries.txt\n\nRetrieving specific objects with get()\n=======================================\n\n:meth:`~django.db.models.query.QuerySet.get` returns a single object matching\nthe given lookup parameters::\n\n    >>> Entry.objects.get(id=1)\n    \u003CEntry: First entry>\n\nIf no object is found, :meth:`~django.db.models.query.QuerySet.get` raises\n:exc:`~django.core.exceptions.ObjectDoesNotExist`::\n\n    >>> Entry.objects.get(id=999)\n    Traceback (most recent call last):\n        ...\n    DoesNotExist: Entry matching query does not exist.\n",[1050,5036,5037,5042,5046,5051,5056,5060,5065,5070,5074,5079,5084,5088,5093,5098,5102,5107,5112,5117],{"__ignoreMap":1048},[1053,5038,5039],{"class":1055,"line":1056},[1053,5040,5041],{},".. docs/topics/db/queries.txt\n",[1053,5043,5044],{"class":1055,"line":1063},[1053,5045,3175],{"emptyLinePlaceholder":3174},[1053,5047,5048],{"class":1055,"line":1070},[1053,5049,5050],{},"Retrieving specific objects with get()\n",[1053,5052,5053],{"class":1055,"line":1077},[1053,5054,5055],{},"=======================================\n",[1053,5057,5058],{"class":1055,"line":1083},[1053,5059,3175],{"emptyLinePlaceholder":3174},[1053,5061,5062],{"class":1055,"line":1089},[1053,5063,5064],{},":meth:`~django.db.models.query.QuerySet.get` returns a single object matching\n",[1053,5066,5067],{"class":1055,"line":1094},[1053,5068,5069],{},"the given lookup parameters::\n",[1053,5071,5072],{"class":1055,"line":1100},[1053,5073,3175],{"emptyLinePlaceholder":3174},[1053,5075,5076],{"class":1055,"line":1105},[1053,5077,5078],{},"    >>> Entry.objects.get(id=1)\n",[1053,5080,5081],{"class":1055,"line":1111},[1053,5082,5083],{},"    \u003CEntry: First entry>\n",[1053,5085,5086],{"class":1055,"line":1116},[1053,5087,3175],{"emptyLinePlaceholder":3174},[1053,5089,5090],{"class":1055,"line":1122},[1053,5091,5092],{},"If no object is found, :meth:`~django.db.models.query.QuerySet.get` raises\n",[1053,5094,5095],{"class":1055,"line":1127},[1053,5096,5097],{},":exc:`~django.core.exceptions.ObjectDoesNotExist`::\n",[1053,5099,5100],{"class":1055,"line":1133},[1053,5101,3175],{"emptyLinePlaceholder":3174},[1053,5103,5104],{"class":1055,"line":1138},[1053,5105,5106],{},"    >>> Entry.objects.get(id=999)\n",[1053,5108,5109],{"class":1055,"line":1144},[1053,5110,5111],{},"    Traceback (most recent call last):\n",[1053,5113,5114],{"class":1055,"line":1283},[1053,5115,5116],{},"        ...\n",[1053,5118,5119],{"class":1055,"line":1289},[1053,5120,5121],{},"    DoesNotExist: Entry matching query does not exist.\n",[1026,5123,5124],{},[1154,5125,5126],{},"5. Translations",[1043,5128,5130],{"className":3135,"code":5129,"language":3137,"meta":1048,"style":1048},"# Update translation files\ncd django/conf/locale/es/LC_MESSAGES\n# Edit django.po\nmsgid \"Enter a valid email address.\"\nmsgstr \"Introduce una dirección de correo electrónico válida.\"\n\n# Compile translations\npython manage.py compilemessages\n",[1050,5131,5132,5137,5144,5149,5161,5173,5177,5182],{"__ignoreMap":1048},[1053,5133,5134],{"class":1055,"line":1056},[1053,5135,5136],{"class":1059},"# Update translation files\n",[1053,5138,5139,5141],{"class":1055,"line":1063},[1053,5140,3166],{"class":1365},[1053,5142,5143],{"class":1868}," django/conf/locale/es/LC_MESSAGES\n",[1053,5145,5146],{"class":1055,"line":1070},[1053,5147,5148],{"class":1059},"# Edit django.po\n",[1053,5150,5151,5154,5156,5159],{"class":1055,"line":1077},[1053,5152,5153],{"class":3154},"msgid",[1053,5155,4112],{"class":1864},[1053,5157,5158],{"class":1868},"Enter a valid email address.",[1053,5160,4118],{"class":1864},[1053,5162,5163,5166,5168,5171],{"class":1055,"line":1083},[1053,5164,5165],{"class":3154},"msgstr",[1053,5167,4112],{"class":1864},[1053,5169,5170],{"class":1868},"Introduce una dirección de correo electrónico válida.",[1053,5172,4118],{"class":1864},[1053,5174,5175],{"class":1055,"line":1089},[1053,5176,3175],{"emptyLinePlaceholder":3174},[1053,5178,5179],{"class":1055,"line":1094},[1053,5180,5181],{"class":1059},"# Compile translations\n",[1053,5183,5184,5186,5189],{"class":1055,"line":1100},[1053,5185,1047],{"class":3154},[1053,5187,5188],{"class":1868}," manage.py",[1053,5190,5191],{"class":1868}," compilemessages\n",[1030,5193,5195],{"id":5194},"djangos-development-process","Django's Development Process",[1035,5197,5199],{"id":5198},"release-cycle","Release Cycle",[1026,5201,5202],{},"Django follows a predictable release schedule:",[1043,5204,5207],{"className":5205,"code":5206,"language":3117},[3115],"Version X.0 (December)\n├── Alpha (October)\n├── Beta (November)\n├── RC (November)\n└── Final (December)\n\nVersion X.1 (April)\n├── Alpha (February)\n├── Beta (March)\n├── RC (March)\n└── Final (April)\n\nVersion X.2 (August) - LTS every 3 years\n├── Alpha (June)\n├── Beta (July)\n├── RC (July)\n└── Final (August)\n",[1050,5208,5206],{"__ignoreMap":1048},[1035,5210,5212],{"id":5211},"feature-deprecation","Feature Deprecation",[1026,5214,5215],{},"Django's deprecation policy:",[1043,5217,5219],{"className":1045,"code":5218,"language":1047,"meta":1048,"style":1048},"# Version 4.0: Feature deprecated\nimport warnings\n\ndef old_function():\n    warnings.warn(\n        'old_function() is deprecated and will be removed in Django 5.0. '\n        'Use new_function() instead.',\n        RemovedInDjango50Warning,\n        stacklevel=2\n    )\n    # Old implementation\n\n# Version 5.0: Feature removed\n# old_function() no longer exists\n",[1050,5220,5221,5226,5234,5238,5247,5259,5269,5280,5287,5297,5302,5307,5311,5316],{"__ignoreMap":1048},[1053,5222,5223],{"class":1055,"line":1056},[1053,5224,5225],{"class":1059},"# Version 4.0: Feature deprecated\n",[1053,5227,5228,5231],{"class":1055,"line":1063},[1053,5229,5230],{"class":1251},"import",[1053,5232,5233],{"class":1207}," warnings\n",[1053,5235,5236],{"class":1055,"line":1070},[1053,5237,3175],{"emptyLinePlaceholder":3174},[1053,5239,5240,5242,5245],{"class":1055,"line":1077},[1053,5241,2355],{"class":1174},[1053,5243,5244],{"class":1216}," old_function",[1053,5246,4889],{"class":1182},[1053,5248,5249,5252,5254,5257],{"class":1055,"line":1083},[1053,5250,5251],{"class":1207},"    warnings",[1053,5253,1421],{"class":1182},[1053,5255,5256],{"class":1489},"warn",[1053,5258,2960],{"class":1182},[1053,5260,5261,5264,5267],{"class":1055,"line":1089},[1053,5262,5263],{"class":1864},"        '",[1053,5265,5266],{"class":1868},"old_function() is deprecated and will be removed in Django 5.0. ",[1053,5268,3935],{"class":1864},[1053,5270,5271,5273,5276,5278],{"class":1055,"line":1094},[1053,5272,5263],{"class":1864},[1053,5274,5275],{"class":1868},"Use new_function() instead.",[1053,5277,1865],{"class":1864},[1053,5279,1911],{"class":1182},[1053,5281,5282,5285],{"class":1055,"line":1100},[1053,5283,5284],{"class":1489},"        RemovedInDjango50Warning",[1053,5286,1911],{"class":1182},[1053,5288,5289,5292,5294],{"class":1055,"line":1105},[1053,5290,5291],{"class":3889},"        stacklevel",[1053,5293,1379],{"class":1182},[1053,5295,5296],{"class":2883},"2\n",[1053,5298,5299],{"class":1055,"line":1111},[1053,5300,5301],{"class":1182},"    )\n",[1053,5303,5304],{"class":1055,"line":1116},[1053,5305,5306],{"class":1059},"    # Old implementation\n",[1053,5308,5309],{"class":1055,"line":1122},[1053,5310,3175],{"emptyLinePlaceholder":3174},[1053,5312,5313],{"class":1055,"line":1127},[1053,5314,5315],{"class":1059},"# Version 5.0: Feature removed\n",[1053,5317,5318],{"class":1055,"line":1133},[1053,5319,5320],{"class":1059},"# old_function() no longer exists\n",[1035,5322,5324],{"id":5323},"decision-making","Decision Making",[1026,5326,5327],{},[1154,5328,5329],{},"Django Enhancement Proposals (DEPs)",[1026,5331,5332],{},"Major changes require a DEP:",[1043,5334,5338],{"className":5335,"code":5336,"language":5337,"meta":1048,"style":1048},"language-markdown shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# DEP 0001: Example Enhancement\n\n## Abstract\nBrief summary of the proposal.\n\n## Motivation\nWhy is this change needed?\n\n## Specification\nDetailed technical specification.\n\n## Backwards Compatibility\nHow does this affect existing code?\n\n## Implementation\nImplementation plan and timeline.\n\n## Copyright\nThis document is placed in the public domain.\n","markdown",[1050,5339,5340,5345,5349,5354,5359,5363,5368,5373,5377,5382,5387,5391,5396,5401,5405,5410,5415,5419,5424],{"__ignoreMap":1048},[1053,5341,5342],{"class":1055,"line":1056},[1053,5343,5344],{},"# DEP 0001: Example Enhancement\n",[1053,5346,5347],{"class":1055,"line":1063},[1053,5348,3175],{"emptyLinePlaceholder":3174},[1053,5350,5351],{"class":1055,"line":1070},[1053,5352,5353],{},"## Abstract\n",[1053,5355,5356],{"class":1055,"line":1077},[1053,5357,5358],{},"Brief summary of the proposal.\n",[1053,5360,5361],{"class":1055,"line":1083},[1053,5362,3175],{"emptyLinePlaceholder":3174},[1053,5364,5365],{"class":1055,"line":1089},[1053,5366,5367],{},"## Motivation\n",[1053,5369,5370],{"class":1055,"line":1094},[1053,5371,5372],{},"Why is this change needed?\n",[1053,5374,5375],{"class":1055,"line":1100},[1053,5376,3175],{"emptyLinePlaceholder":3174},[1053,5378,5379],{"class":1055,"line":1105},[1053,5380,5381],{},"## Specification\n",[1053,5383,5384],{"class":1055,"line":1111},[1053,5385,5386],{},"Detailed technical specification.\n",[1053,5388,5389],{"class":1055,"line":1116},[1053,5390,3175],{"emptyLinePlaceholder":3174},[1053,5392,5393],{"class":1055,"line":1122},[1053,5394,5395],{},"## Backwards Compatibility\n",[1053,5397,5398],{"class":1055,"line":1127},[1053,5399,5400],{},"How does this affect existing code?\n",[1053,5402,5403],{"class":1055,"line":1133},[1053,5404,3175],{"emptyLinePlaceholder":3174},[1053,5406,5407],{"class":1055,"line":1138},[1053,5408,5409],{},"## Implementation\n",[1053,5411,5412],{"class":1055,"line":1144},[1053,5413,5414],{},"Implementation plan and timeline.\n",[1053,5416,5417],{"class":1055,"line":1283},[1053,5418,3175],{"emptyLinePlaceholder":3174},[1053,5420,5421],{"class":1055,"line":1289},[1053,5422,5423],{},"## Copyright\n",[1053,5425,5426],{"class":1055,"line":1294},[1053,5427,5428],{},"This document is placed in the public domain.\n",[1035,5430,5432],{"id":5431},"core-team-structure","Core Team Structure",[3498,5434,5435,5441,5447,5453],{},[3501,5436,5437,5440],{},[1154,5438,5439],{},"BDFL-Delegate",": Makes final decisions on DEPs",[3501,5442,5443,5446],{},[1154,5444,5445],{},"Mergers",": Review and merge pull requests",[3501,5448,5449,5452],{},[1154,5450,5451],{},"Releasers",": Manage Django releases",[3501,5454,5455,5458],{},[1154,5456,5457],{},"Technical Board",": Oversees project direction",[1030,5460,5462],{"id":5461},"advanced-internals","Advanced Internals",[1035,5464,5466],{"id":5465},"custom-database-backend","Custom Database Backend",[1043,5468,5470],{"className":1045,"code":5469,"language":1047,"meta":1048,"style":1048},"# myproject/db_backend/base.py\nfrom django.db.backends.postgresql import base\n\nclass DatabaseWrapper(base.DatabaseWrapper):\n    \"\"\"\n    Custom PostgreSQL backend with additional features.\n    \"\"\"\n    vendor = 'postgresql_custom'\n    \n    def get_connection_params(self):\n        params = super().get_connection_params()\n        # Add custom connection parameters\n        params['options'] = '-c statement_timeout=5000'\n        return params\n",[1050,5471,5472,5477,5504,5508,5527,5531,5536,5540,5554,5558,5571,5587,5592,5617],{"__ignoreMap":1048},[1053,5473,5474],{"class":1055,"line":1056},[1053,5475,5476],{"class":1059},"# myproject/db_backend/base.py\n",[1053,5478,5479,5482,5484,5486,5489,5491,5494,5496,5499,5501],{"class":1055,"line":1063},[1053,5480,5481],{"class":1251},"from",[1053,5483,3481],{"class":1207},[1053,5485,1421],{"class":1182},[1053,5487,5488],{"class":1207},"db",[1053,5490,1421],{"class":1182},[1053,5492,5493],{"class":1207},"backends",[1053,5495,1421],{"class":1182},[1053,5497,5498],{"class":1207},"postgresql ",[1053,5500,5230],{"class":1251},[1053,5502,5503],{"class":1207}," base\n",[1053,5505,5506],{"class":1055,"line":1070},[1053,5507,3175],{"emptyLinePlaceholder":3174},[1053,5509,5510,5512,5515,5517,5520,5522,5525],{"class":1055,"line":1077},[1053,5511,1175],{"class":1174},[1053,5513,5514],{"class":1178}," DatabaseWrapper",[1053,5516,1220],{"class":1182},[1053,5518,5519],{"class":3154},"base",[1053,5521,1421],{"class":1182},[1053,5523,5524],{"class":3154},"DatabaseWrapper",[1053,5526,1227],{"class":1182},[1053,5528,5529],{"class":1055,"line":1083},[1053,5530,1188],{"class":1066},[1053,5532,5533],{"class":1055,"line":1089},[1053,5534,5535],{"class":1073},"    Custom PostgreSQL backend with additional features.\n",[1053,5537,5538],{"class":1055,"line":1094},[1053,5539,1188],{"class":1066},[1053,5541,5542,5545,5547,5549,5552],{"class":1055,"line":1100},[1053,5543,5544],{"class":1207},"    vendor ",[1053,5546,1379],{"class":1182},[1053,5548,2578],{"class":1864},[1053,5550,5551],{"class":1868},"postgresql_custom",[1053,5553,3935],{"class":1864},[1053,5555,5556],{"class":1055,"line":1105},[1053,5557,1208],{"class":1207},[1053,5559,5560,5562,5565,5567,5569],{"class":1055,"line":1111},[1053,5561,1213],{"class":1174},[1053,5563,5564],{"class":1216}," get_connection_params",[1053,5566,1220],{"class":1182},[1053,5568,1224],{"class":1223},[1053,5570,1227],{"class":1182},[1053,5572,5573,5576,5578,5580,5582,5585],{"class":1055,"line":1116},[1053,5574,5575],{"class":1207},"        params ",[1053,5577,1379],{"class":1182},[1053,5579,3729],{"class":3675},[1053,5581,3679],{"class":1182},[1053,5583,5584],{"class":1489},"get_connection_params",[1053,5586,1724],{"class":1182},[1053,5588,5589],{"class":1055,"line":1122},[1053,5590,5591],{"class":1059},"        # Add custom connection parameters\n",[1053,5593,5594,5597,5599,5601,5604,5606,5608,5610,5612,5615],{"class":1055,"line":1127},[1053,5595,5596],{"class":1207},"        params",[1053,5598,2880],{"class":1182},[1053,5600,1865],{"class":1864},[1053,5602,5603],{"class":1868},"options",[1053,5605,1865],{"class":1864},[1053,5607,3020],{"class":1182},[1053,5609,1428],{"class":1182},[1053,5611,2578],{"class":1864},[1053,5613,5614],{"class":1868},"-c statement_timeout=5000",[1053,5616,3935],{"class":1864},[1053,5618,5619,5621],{"class":1055,"line":1133},[1053,5620,1764],{"class":1251},[1053,5622,5623],{"class":1207}," params\n",[1035,5625,5627],{"id":5626},"custom-template-tags","Custom Template Tags",[1043,5629,5631],{"className":1045,"code":5630,"language":1047,"meta":1048,"style":1048},"# django/template/defaulttags.py (simplified)\nfrom django import template\n\nregister = template.Library()\n\n@register.tag\ndef custom_tag(parser, token):\n    \"\"\"\n    Custom template tag implementation.\n    \"\"\"\n    try:\n        tag_name, arg = token.split_contents()\n    except ValueError:\n        raise template.TemplateSyntaxError(\n            f\"{token.contents.split()[0]} tag requires exactly one argument\"\n        )\n    \n    return CustomNode(arg)\n\nclass CustomNode(template.Node):\n    def __init__(self, arg):\n        self.arg = template.Variable(arg)\n    \n    def render(self, context):\n        value = self.arg.resolve(context)\n        return f\"Processed: {value}\"\n",[1050,5632,5633,5638,5650,5654,5671,5675,5688,5707,5711,5716,5720,5727,5748,5757,5770,5806,5811,5815,5829,5833,5851,5868,5891,5895,5911,5933],{"__ignoreMap":1048},[1053,5634,5635],{"class":1055,"line":1056},[1053,5636,5637],{"class":1059},"# django/template/defaulttags.py (simplified)\n",[1053,5639,5640,5642,5645,5647],{"class":1055,"line":1063},[1053,5641,5481],{"class":1251},[1053,5643,5644],{"class":1207}," django ",[1053,5646,5230],{"class":1251},[1053,5648,5649],{"class":1207}," template\n",[1053,5651,5652],{"class":1055,"line":1070},[1053,5653,3175],{"emptyLinePlaceholder":3174},[1053,5655,5656,5659,5661,5664,5666,5669],{"class":1055,"line":1077},[1053,5657,5658],{"class":1207},"register ",[1053,5660,1379],{"class":1182},[1053,5662,5663],{"class":1207}," template",[1053,5665,1421],{"class":1182},[1053,5667,5668],{"class":1489},"Library",[1053,5670,1724],{"class":1182},[1053,5672,5673],{"class":1055,"line":1083},[1053,5674,3175],{"emptyLinePlaceholder":3174},[1053,5676,5677,5680,5683,5685],{"class":1055,"line":1089},[1053,5678,5679],{"class":1182},"@",[1053,5681,5682],{"class":1216},"register",[1053,5684,1421],{"class":1182},[1053,5686,5687],{"class":1216},"tag\n",[1053,5689,5690,5692,5695,5697,5700,5702,5705],{"class":1055,"line":1094},[1053,5691,2355],{"class":1174},[1053,5693,5694],{"class":1216}," custom_tag",[1053,5696,1220],{"class":1182},[1053,5698,5699],{"class":1273},"parser",[1053,5701,1270],{"class":1182},[1053,5703,5704],{"class":1273}," token",[1053,5706,1227],{"class":1182},[1053,5708,5709],{"class":1055,"line":1100},[1053,5710,1188],{"class":1066},[1053,5712,5713],{"class":1055,"line":1105},[1053,5714,5715],{"class":1073},"    Custom template tag implementation.\n",[1053,5717,5718],{"class":1055,"line":1111},[1053,5719,1188],{"class":1066},[1053,5721,5722,5725],{"class":1055,"line":1116},[1053,5723,5724],{"class":1251},"    try",[1053,5726,1183],{"class":1182},[1053,5728,5729,5732,5734,5737,5739,5741,5743,5746],{"class":1055,"line":1122},[1053,5730,5731],{"class":1207},"        tag_name",[1053,5733,1270],{"class":1182},[1053,5735,5736],{"class":1207}," arg ",[1053,5738,1379],{"class":1182},[1053,5740,5704],{"class":1207},[1053,5742,1421],{"class":1182},[1053,5744,5745],{"class":1489},"split_contents",[1053,5747,1724],{"class":1182},[1053,5749,5750,5753,5755],{"class":1055,"line":1127},[1053,5751,5752],{"class":1251},"    except",[1053,5754,4397],{"class":3675},[1053,5756,1183],{"class":1182},[1053,5758,5759,5761,5763,5765,5768],{"class":1055,"line":1133},[1053,5760,3074],{"class":1251},[1053,5762,5663],{"class":1207},[1053,5764,1421],{"class":1182},[1053,5766,5767],{"class":1489},"TemplateSyntaxError",[1053,5769,2960],{"class":1182},[1053,5771,5772,5775,5777,5780,5783,5785,5788,5790,5793,5796,5798,5800,5803],{"class":1055,"line":1138},[1053,5773,5774],{"class":1174},"            f",[1053,5776,4402],{"class":1868},[1053,5778,5779],{"class":1872},"{",[1053,5781,5782],{"class":1489},"token",[1053,5784,1421],{"class":1182},[1053,5786,5787],{"class":1424},"contents",[1053,5789,1421],{"class":1182},[1053,5791,5792],{"class":1489},"split",[1053,5794,5795],{"class":1182},"()[",[1053,5797,2884],{"class":2883},[1053,5799,3020],{"class":1182},[1053,5801,5802],{"class":1872},"}",[1053,5804,5805],{"class":1868}," tag requires exactly one argument\"\n",[1053,5807,5808],{"class":1055,"line":1144},[1053,5809,5810],{"class":1182},"        )\n",[1053,5812,5813],{"class":1055,"line":1283},[1053,5814,1208],{"class":1207},[1053,5816,5817,5819,5822,5824,5827],{"class":1055,"line":1289},[1053,5818,2647],{"class":1251},[1053,5820,5821],{"class":1489}," CustomNode",[1053,5823,1220],{"class":1182},[1053,5825,5826],{"class":1489},"arg",[1053,5828,1501],{"class":1182},[1053,5830,5831],{"class":1055,"line":1294},[1053,5832,3175],{"emptyLinePlaceholder":3174},[1053,5834,5835,5837,5839,5841,5844,5846,5849],{"class":1055,"line":1300},[1053,5836,1175],{"class":1174},[1053,5838,5821],{"class":1178},[1053,5840,1220],{"class":1182},[1053,5842,5843],{"class":3154},"template",[1053,5845,1421],{"class":1182},[1053,5847,5848],{"class":3154},"Node",[1053,5850,1227],{"class":1182},[1053,5852,5853,5855,5857,5859,5861,5863,5866],{"class":1055,"line":1306},[1053,5854,1213],{"class":1174},[1053,5856,1366],{"class":1365},[1053,5858,1220],{"class":1182},[1053,5860,1224],{"class":1223},[1053,5862,1270],{"class":1182},[1053,5864,5865],{"class":1273}," arg",[1053,5867,1227],{"class":1182},[1053,5869,5870,5872,5874,5876,5878,5880,5882,5885,5887,5889],{"class":1055,"line":1312},[1053,5871,1418],{"class":1417},[1053,5873,1421],{"class":1182},[1053,5875,5826],{"class":1424},[1053,5877,1428],{"class":1182},[1053,5879,5663],{"class":1207},[1053,5881,1421],{"class":1182},[1053,5883,5884],{"class":1489},"Variable",[1053,5886,1220],{"class":1182},[1053,5888,5826],{"class":1489},[1053,5890,1501],{"class":1182},[1053,5892,5893],{"class":1055,"line":2321},[1053,5894,1208],{"class":1207},[1053,5896,5897,5899,5901,5903,5905,5907,5909],{"class":1055,"line":2326},[1053,5898,1213],{"class":1174},[1053,5900,1735],{"class":1216},[1053,5902,1220],{"class":1182},[1053,5904,1224],{"class":1223},[1053,5906,1270],{"class":1182},[1053,5908,1744],{"class":1273},[1053,5910,1227],{"class":1182},[1053,5912,5913,5915,5917,5919,5921,5923,5925,5927,5929,5931],{"class":1055,"line":2332},[1053,5914,3724],{"class":1207},[1053,5916,1379],{"class":1182},[1053,5918,1716],{"class":1417},[1053,5920,1421],{"class":1182},[1053,5922,5826],{"class":1424},[1053,5924,1421],{"class":1182},[1053,5926,2834],{"class":1489},[1053,5928,1220],{"class":1182},[1053,5930,1780],{"class":1489},[1053,5932,1501],{"class":1182},[1053,5934,5935,5937,5940,5943,5945,5947,5949],{"class":1055,"line":2963},[1053,5936,1764],{"class":1251},[1053,5938,5939],{"class":1174}," f",[1053,5941,5942],{"class":1868},"\"Processed: ",[1053,5944,5779],{"class":1872},[1053,5946,3739],{"class":1207},[1053,5948,5802],{"class":1872},[1053,5950,4118],{"class":1868},[1035,5952,5954],{"id":5953},"custom-model-fields","Custom Model Fields",[1043,5956,5958],{"className":1045,"code":5957,"language":1047,"meta":1048,"style":1048},"# myapp/fields.py\nfrom django.db import models\nfrom django.core import checks\n\nclass UpperCaseCharField(models.CharField):\n    \"\"\"\n    CharField that stores values in uppercase.\n    \"\"\"\n    \n    description = \"CharField that converts to uppercase\"\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n    \n    def get_prep_value(self, value):\n        value = super().get_prep_value(value)\n        if value is not None:\n            return value.upper()\n        return value\n    \n    def from_db_value(self, value, expression, connection):\n        if value is None:\n            return value\n        return value.upper()\n    \n    def check(self, **kwargs):\n        return [\n            *super().check(**kwargs),\n            *self._check_max_length_attribute(**kwargs),\n        ]\n    \n    def _check_max_length_attribute(self, **kwargs):\n        if self.max_length is None:\n            return [\n                checks.Error(\n                    'UpperCaseCharFields must define a max_length attribute.',\n                    obj=self,\n                    id='fields.E120',\n                )\n            ]\n        return []\n",[1050,5959,5960,5965,5981,5997,6001,6018,6022,6027,6031,6035,6049,6053,6077,6099,6103,6119,6137,6152,6166,6172,6176,6203,6215,6221,6233,6237,6255,6262,6284,6303,6308,6312,6331,6348,6354,6367,6380,6392,6409,6415,6421],{"__ignoreMap":1048},[1053,5961,5962],{"class":1055,"line":1056},[1053,5963,5964],{"class":1059},"# myapp/fields.py\n",[1053,5966,5967,5969,5971,5973,5976,5978],{"class":1055,"line":1063},[1053,5968,5481],{"class":1251},[1053,5970,3481],{"class":1207},[1053,5972,1421],{"class":1182},[1053,5974,5975],{"class":1207},"db ",[1053,5977,5230],{"class":1251},[1053,5979,5980],{"class":1207}," models\n",[1053,5982,5983,5985,5987,5989,5992,5994],{"class":1055,"line":1070},[1053,5984,5481],{"class":1251},[1053,5986,3481],{"class":1207},[1053,5988,1421],{"class":1182},[1053,5990,5991],{"class":1207},"core ",[1053,5993,5230],{"class":1251},[1053,5995,5996],{"class":1207}," checks\n",[1053,5998,5999],{"class":1055,"line":1077},[1053,6000,3175],{"emptyLinePlaceholder":3174},[1053,6002,6003,6005,6008,6010,6012,6014,6016],{"class":1055,"line":1083},[1053,6004,1175],{"class":1174},[1053,6006,6007],{"class":1178}," UpperCaseCharField",[1053,6009,1220],{"class":1182},[1053,6011,3862],{"class":3154},[1053,6013,1421],{"class":1182},[1053,6015,3884],{"class":3154},[1053,6017,1227],{"class":1182},[1053,6019,6020],{"class":1055,"line":1089},[1053,6021,1188],{"class":1066},[1053,6023,6024],{"class":1055,"line":1094},[1053,6025,6026],{"class":1073},"    CharField that stores values in uppercase.\n",[1053,6028,6029],{"class":1055,"line":1100},[1053,6030,1188],{"class":1066},[1053,6032,6033],{"class":1055,"line":1105},[1053,6034,1208],{"class":1207},[1053,6036,6037,6040,6042,6044,6047],{"class":1055,"line":1111},[1053,6038,6039],{"class":1207},"    description ",[1053,6041,1379],{"class":1182},[1053,6043,4112],{"class":1864},[1053,6045,6046],{"class":1868},"CharField that converts to uppercase",[1053,6048,4118],{"class":1864},[1053,6050,6051],{"class":1055,"line":1116},[1053,6052,1208],{"class":1207},[1053,6054,6055,6057,6059,6061,6063,6065,6067,6069,6071,6073,6075],{"class":1055,"line":1122},[1053,6056,1213],{"class":1174},[1053,6058,1366],{"class":1365},[1053,6060,1220],{"class":1182},[1053,6062,1224],{"class":1223},[1053,6064,1270],{"class":1182},[1053,6066,2540],{"class":1378},[1053,6068,2877],{"class":1273},[1053,6070,1270],{"class":1182},[1053,6072,2304],{"class":1378},[1053,6074,2935],{"class":1273},[1053,6076,1227],{"class":1182},[1053,6078,6079,6081,6083,6085,6087,6089,6091,6093,6095,6097],{"class":1055,"line":1127},[1053,6080,3676],{"class":3675},[1053,6082,3679],{"class":1182},[1053,6084,3682],{"class":1365},[1053,6086,1220],{"class":1182},[1053,6088,3687],{"class":1378},[1053,6090,2877],{"class":1489},[1053,6092,1270],{"class":1182},[1053,6094,2304],{"class":1378},[1053,6096,2935],{"class":1489},[1053,6098,1501],{"class":1182},[1053,6100,6101],{"class":1055,"line":1133},[1053,6102,1208],{"class":1207},[1053,6104,6105,6107,6109,6111,6113,6115,6117],{"class":1055,"line":1138},[1053,6106,1213],{"class":1174},[1053,6108,3708],{"class":1216},[1053,6110,1220],{"class":1182},[1053,6112,1224],{"class":1223},[1053,6114,1270],{"class":1182},[1053,6116,3717],{"class":1273},[1053,6118,1227],{"class":1182},[1053,6120,6121,6123,6125,6127,6129,6131,6133,6135],{"class":1055,"line":1144},[1053,6122,3724],{"class":1207},[1053,6124,1379],{"class":1182},[1053,6126,3729],{"class":3675},[1053,6128,3679],{"class":1182},[1053,6130,3734],{"class":1489},[1053,6132,1220],{"class":1182},[1053,6134,3739],{"class":1489},[1053,6136,1501],{"class":1182},[1053,6138,6139,6141,6144,6146,6148,6150],{"class":1055,"line":1283},[1053,6140,2490],{"class":1251},[1053,6142,6143],{"class":1207}," value ",[1053,6145,1989],{"class":1378},[1053,6147,1992],{"class":1378},[1053,6149,1995],{"class":1382},[1053,6151,1183],{"class":1182},[1053,6153,6154,6157,6159,6161,6164],{"class":1055,"line":1289},[1053,6155,6156],{"class":1251},"            return",[1053,6158,3717],{"class":1207},[1053,6160,1421],{"class":1182},[1053,6162,6163],{"class":1489},"upper",[1053,6165,1724],{"class":1182},[1053,6167,6168,6170],{"class":1055,"line":1294},[1053,6169,1764],{"class":1251},[1053,6171,3790],{"class":1207},[1053,6173,6174],{"class":1055,"line":1300},[1053,6175,1208],{"class":1207},[1053,6177,6178,6180,6183,6185,6187,6189,6191,6193,6196,6198,6201],{"class":1055,"line":1306},[1053,6179,1213],{"class":1174},[1053,6181,6182],{"class":1216}," from_db_value",[1053,6184,1220],{"class":1182},[1053,6186,1224],{"class":1223},[1053,6188,1270],{"class":1182},[1053,6190,3717],{"class":1273},[1053,6192,1270],{"class":1182},[1053,6194,6195],{"class":1273}," expression",[1053,6197,1270],{"class":1182},[1053,6199,6200],{"class":1273}," connection",[1053,6202,1227],{"class":1182},[1053,6204,6205,6207,6209,6211,6213],{"class":1055,"line":1312},[1053,6206,2490],{"class":1251},[1053,6208,6143],{"class":1207},[1053,6210,1989],{"class":1378},[1053,6212,1995],{"class":1382},[1053,6214,1183],{"class":1182},[1053,6216,6217,6219],{"class":1055,"line":2321},[1053,6218,6156],{"class":1251},[1053,6220,3790],{"class":1207},[1053,6222,6223,6225,6227,6229,6231],{"class":1055,"line":2326},[1053,6224,1764],{"class":1251},[1053,6226,3717],{"class":1207},[1053,6228,1421],{"class":1182},[1053,6230,6163],{"class":1489},[1053,6232,1724],{"class":1182},[1053,6234,6235],{"class":1055,"line":2332},[1053,6236,1208],{"class":1207},[1053,6238,6239,6241,6243,6245,6247,6249,6251,6253],{"class":1055,"line":2963},[1053,6240,1213],{"class":1174},[1053,6242,3484],{"class":1216},[1053,6244,1220],{"class":1182},[1053,6246,1224],{"class":1223},[1053,6248,1270],{"class":1182},[1053,6250,2304],{"class":1378},[1053,6252,2935],{"class":1273},[1053,6254,1227],{"class":1182},[1053,6256,6257,6259],{"class":1055,"line":2976},[1053,6258,1764],{"class":1251},[1053,6260,6261],{"class":1182}," [\n",[1053,6263,6264,6267,6270,6272,6275,6277,6279,6281],{"class":1055,"line":2987},[1053,6265,6266],{"class":1378},"            *",[1053,6268,6269],{"class":3675},"super",[1053,6271,3679],{"class":1182},[1053,6273,6274],{"class":1489},"check",[1053,6276,1220],{"class":1182},[1053,6278,2932],{"class":1378},[1053,6280,2935],{"class":1489},[1053,6282,6283],{"class":1182},"),\n",[1053,6285,6286,6288,6290,6292,6295,6297,6299,6301],{"class":1055,"line":2995},[1053,6287,6266],{"class":1378},[1053,6289,1224],{"class":1417},[1053,6291,1421],{"class":1182},[1053,6293,6294],{"class":1489},"_check_max_length_attribute",[1053,6296,1220],{"class":1182},[1053,6298,2932],{"class":1378},[1053,6300,2935],{"class":1489},[1053,6302,6283],{"class":1182},[1053,6304,6305],{"class":1055,"line":3007},[1053,6306,6307],{"class":1182},"        ]\n",[1053,6309,6310],{"class":1055,"line":3035},[1053,6311,1208],{"class":1207},[1053,6313,6314,6316,6319,6321,6323,6325,6327,6329],{"class":1055,"line":3060},[1053,6315,1213],{"class":1174},[1053,6317,6318],{"class":1216}," _check_max_length_attribute",[1053,6320,1220],{"class":1182},[1053,6322,1224],{"class":1223},[1053,6324,1270],{"class":1182},[1053,6326,2304],{"class":1378},[1053,6328,2935],{"class":1273},[1053,6330,1227],{"class":1182},[1053,6332,6333,6335,6337,6339,6341,6344,6346],{"class":1055,"line":3066},[1053,6334,2490],{"class":1251},[1053,6336,1716],{"class":1417},[1053,6338,1421],{"class":1182},[1053,6340,3890],{"class":1424},[1053,6342,6343],{"class":1378}," is",[1053,6345,1995],{"class":1382},[1053,6347,1183],{"class":1182},[1053,6349,6350,6352],{"class":1055,"line":3071},[1053,6351,6156],{"class":1251},[1053,6353,6261],{"class":1182},[1053,6355,6357,6360,6362,6365],{"class":1055,"line":6356},35,[1053,6358,6359],{"class":1207},"                checks",[1053,6361,1421],{"class":1182},[1053,6363,6364],{"class":1489},"Error",[1053,6366,2960],{"class":1182},[1053,6368,6370,6373,6376,6378],{"class":1055,"line":6369},36,[1053,6371,6372],{"class":1864},"                    '",[1053,6374,6375],{"class":1868},"UpperCaseCharFields must define a max_length attribute.",[1053,6377,1865],{"class":1864},[1053,6379,1911],{"class":1182},[1053,6381,6383,6386,6388,6390],{"class":1055,"line":6382},37,[1053,6384,6385],{"class":3889},"                    obj",[1053,6387,1379],{"class":1182},[1053,6389,1224],{"class":1417},[1053,6391,1911],{"class":1182},[1053,6393,6395,6398,6400,6402,6405,6407],{"class":1055,"line":6394},38,[1053,6396,6397],{"class":3889},"                    id",[1053,6399,1379],{"class":1182},[1053,6401,1865],{"class":1864},[1053,6403,6404],{"class":1868},"fields.E120",[1053,6406,1865],{"class":1864},[1053,6408,1911],{"class":1182},[1053,6410,6412],{"class":1055,"line":6411},39,[1053,6413,6414],{"class":1182},"                )\n",[1053,6416,6418],{"class":1055,"line":6417},40,[1053,6419,6420],{"class":1182},"            ]\n",[1053,6422,6424,6426],{"class":1055,"line":6423},41,[1053,6425,1764],{"class":1251},[1053,6427,2150],{"class":1182},[1030,6429,6431],{"id":6430},"resources","Resources",[1035,6433,6435],{"id":6434},"official-resources","Official Resources",[3498,6437,6438,6445,6451,6458],{},[3501,6439,6440],{},[3505,6441,6444],{"href":6442,"rel":6443},"https://github.com/django/django",[3509],"Django GitHub Repository",[3501,6446,6447],{},[3505,6448,6450],{"href":3507,"rel":6449},[3509],"Django Trac (Issue Tracker)",[3501,6452,6453],{},[3505,6454,6457],{"href":6455,"rel":6456},"https://groups.google.com/g/django-developers",[3509],"Django Developers Mailing List",[3501,6459,6460],{},[3505,6461,6464],{"href":6462,"rel":6463},"https://docs.djangoproject.com/en/dev/internals/",[3509],"Django Internals Documentation",[1035,6466,6468],{"id":6467},"community","Community",[3498,6470,6471,6474,6477,6480],{},[3501,6472,6473],{},"#django-dev on Libera.Chat IRC",[3501,6475,6476],{},"Django Discord server",[3501,6478,6479],{},"Django Forum (Developers category)",[3501,6481,6482],{},"DjangoCon conferences",[1035,6484,6486],{"id":6485},"learning","Learning",[3498,6488,6489,6492,6495,6498],{},[3501,6490,6491],{},"Django source code reading",[3501,6493,6494],{},"Django's test suite examples",[3501,6496,6497],{},"Core developer blogs",[3501,6499,6500],{},"Django Under The Hood talks",[1030,6502,6504],{"id":6503},"next-steps","Next Steps",[3498,6506,6507,6513,6519,6525],{},[3501,6508,6509,6510,6512],{},"Explore ",[3505,6511,863],{"href":864}," to understand the broader Django community",[3501,6514,6515,6516,6518],{},"Review ",[3505,6517,801],{"href":802}," for advanced Django patterns",[3501,6520,6521,6522,6524],{},"Check ",[3505,6523,579],{"href":580}," to learn Django's testing practices",[3501,6526,6527,6528,6530],{},"See ",[3505,6529,775],{"href":776}," for internal optimization techniques",[6532,6533,6534],"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 .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 .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 .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 .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--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 .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 .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 .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}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}",{"title":1048,"searchDepth":1056,"depth":1063,"links":6536},[6537,6544,6545,6551,6557,6562,6567],{"id":1032,"depth":1063,"text":1033,"children":6538},[6539,6540,6541,6542,6543],{"id":1037,"depth":1070,"text":1038},{"id":1149,"depth":1070,"text":1150},{"id":2075,"depth":1070,"text":2076},{"id":2337,"depth":1070,"text":2338},{"id":2653,"depth":1070,"text":2654},{"id":3110,"depth":1063,"text":3111},{"id":3122,"depth":1063,"text":3123,"children":6546},[6547,6548,6549,6550],{"id":3126,"depth":1070,"text":3127},{"id":3490,"depth":1070,"text":3491},{"id":4155,"depth":1070,"text":4156},{"id":4621,"depth":1070,"text":4622},{"id":5194,"depth":1063,"text":5195,"children":6552},[6553,6554,6555,6556],{"id":5198,"depth":1070,"text":5199},{"id":5211,"depth":1070,"text":5212},{"id":5323,"depth":1070,"text":5324},{"id":5431,"depth":1070,"text":5432},{"id":5461,"depth":1063,"text":5462,"children":6558},[6559,6560,6561],{"id":5465,"depth":1070,"text":5466},{"id":5626,"depth":1070,"text":5627},{"id":5953,"depth":1070,"text":5954},{"id":6430,"depth":1063,"text":6431,"children":6563},[6564,6565,6566],{"id":6434,"depth":1070,"text":6435},{"id":6467,"depth":1070,"text":6468},{"id":6485,"depth":1070,"text":6486},{"id":6503,"depth":1063,"text":6504},"Understand Django's internal architecture, learn how to contribute to the Django project, and become part of the Django community.","md",null,{},{"title":869,"description":6568},"oeM0yevaEVT2hna_kK4kJBHkbqf2kHIHplNZQqL_3JE",[6575,6577],{"title":863,"path":864,"stem":865,"description":6576,"children":-1},"Explore the rich Django ecosystem, popular third-party packages, and best practices for selecting and integrating external tools into your Django projects.",{"title":875,"path":876,"stem":877,"description":6578,"children":-1},"Welcome to the comprehensive guide on building microservices with Django. This chapter explores how to architect, develop, deploy, and maintain microservices using Django as your primary framework.",1772474961584]