[{"data":1,"prerenderedAt":8681},["ShallowReactive",2],{"navigation":3,"/introduction-and-foundations/key-concepts-and-philosophy":1016,"/introduction-and-foundations/key-concepts-and-philosophy-surround":8676},[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":15,"body":1018,"description":1028,"extension":8671,"links":8672,"meta":8673,"navigation":1253,"path":16,"seo":8674,"stem":17,"__hash__":8675},"docs/01.introduction-and-foundations/03.key-concepts-and-philosophy.md",{"type":1019,"value":1020,"toc":8647},"minimark",[1021,1025,1029,1034,1039,1042,1048,1589,1593,1596,1601,1906,1910,1913,1918,2262,2266,2269,2273,2564,2568,2572,2575,3471,3475,3478,3920,3924,4001,4005,4009,4012,4868,4872,4875,5620,5624,5627,7057,7061,7064,7596,7600,7604,7607,8114,8118,8121,8640,8643],[1022,1023,15],"h1",{"id":1024},"key-concepts-and-philosophy",[1026,1027,1028],"p",{},"Django's design philosophy shapes every aspect of the framework, creating a consistent and predictable development experience. Understanding these principles will help you write better Django code and make architectural decisions that align with the framework's strengths.",[1030,1031,1033],"h2",{"id":1032},"the-django-philosophy","The Django Philosophy",[1035,1036,1038],"h3",{"id":1037},"_1-dry-dont-repeat-yourself","1. DRY (Don't Repeat Yourself)",[1026,1040,1041],{},"Every piece of knowledge should have a single, unambiguous representation within a system.",[1026,1043,1044],{},[1045,1046,1047],"strong",{},"In Practice:",[1049,1050,1055],"pre",{"className":1051,"code":1052,"language":1053,"meta":1054,"style":1054},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Bad: Repeating validation logic\nclass UserForm(forms.Form):\n    email = forms.EmailField()\n    \n    def clean_email(self):\n        email = self.cleaned_data['email']\n        if User.objects.filter(email=email).exists():\n            raise forms.ValidationError(\"Email already exists\")\n        return email\n\nclass UserRegistrationForm(forms.Form):\n    email = forms.EmailField()\n    \n    def clean_email(self):\n        email = self.cleaned_data['email']\n        if User.objects.filter(email=email).exists():  # Repeated logic\n            raise forms.ValidationError(\"Email already exists\")\n        return email\n\n# Good: Centralized validation\nclass UniqueEmailMixin:\n    def clean_email(self):\n        email = self.cleaned_data['email']\n        if User.objects.filter(email=email).exists():\n            raise forms.ValidationError(\"Email already exists\")\n        return email\n\nclass UserForm(UniqueEmailMixin, forms.Form):\n    email = forms.EmailField()\n\nclass UserRegistrationForm(UniqueEmailMixin, forms.Form):\n    email = forms.EmailField()\n","python","",[1056,1057,1058,1067,1095,1117,1123,1141,1175,1213,1239,1248,1255,1273,1288,1293,1306,1329,1362,1383,1390,1395,1401,1412,1425,1448,1477,1498,1505,1510,1533,1548,1553,1574],"code",{"__ignoreMap":1054},[1059,1060,1063],"span",{"class":1061,"line":1062},"line",1,[1059,1064,1066],{"class":1065},"s9Tkl","# Bad: Repeating validation logic\n",[1059,1068,1070,1074,1078,1082,1086,1089,1092],{"class":1061,"line":1069},2,[1059,1071,1073],{"class":1072},"s5Kfy","class",[1059,1075,1077],{"class":1076},"sD-vU"," UserForm",[1059,1079,1081],{"class":1080},"soVBu","(",[1059,1083,1085],{"class":1084},"sYn-s","forms",[1059,1087,1088],{"class":1080},".",[1059,1090,1091],{"class":1084},"Form",[1059,1093,1094],{"class":1080},"):\n",[1059,1096,1098,1102,1105,1108,1110,1114],{"class":1061,"line":1097},3,[1059,1099,1101],{"class":1100},"sftqT","    email ",[1059,1103,1104],{"class":1080},"=",[1059,1106,1107],{"class":1100}," forms",[1059,1109,1088],{"class":1080},[1059,1111,1113],{"class":1112},"siWMO","EmailField",[1059,1115,1116],{"class":1080},"()\n",[1059,1118,1120],{"class":1061,"line":1119},4,[1059,1121,1122],{"class":1100},"    \n",[1059,1124,1126,1129,1133,1135,1139],{"class":1061,"line":1125},5,[1059,1127,1128],{"class":1072},"    def",[1059,1130,1132],{"class":1131},"sljsM"," clean_email",[1059,1134,1081],{"class":1080},[1059,1136,1138],{"class":1137},"sRjD_","self",[1059,1140,1094],{"class":1080},[1059,1142,1144,1147,1149,1153,1155,1159,1162,1166,1170,1172],{"class":1061,"line":1143},6,[1059,1145,1146],{"class":1100},"        email ",[1059,1148,1104],{"class":1080},[1059,1150,1152],{"class":1151},"se3Ec"," self",[1059,1154,1088],{"class":1080},[1059,1156,1158],{"class":1157},"sBPpx","cleaned_data",[1059,1160,1161],{"class":1080},"[",[1059,1163,1165],{"class":1164},"sbYkP","'",[1059,1167,1169],{"class":1168},"sTbE_","email",[1059,1171,1165],{"class":1164},[1059,1173,1174],{"class":1080},"]\n",[1059,1176,1178,1182,1185,1187,1190,1192,1195,1197,1200,1202,1204,1207,1210],{"class":1061,"line":1177},7,[1059,1179,1181],{"class":1180},"siDh9","        if",[1059,1183,1184],{"class":1100}," User",[1059,1186,1088],{"class":1080},[1059,1188,1189],{"class":1157},"objects",[1059,1191,1088],{"class":1080},[1059,1193,1194],{"class":1112},"filter",[1059,1196,1081],{"class":1080},[1059,1198,1169],{"class":1199},"sqOPj",[1059,1201,1104],{"class":1080},[1059,1203,1169],{"class":1112},[1059,1205,1206],{"class":1080},").",[1059,1208,1209],{"class":1112},"exists",[1059,1211,1212],{"class":1080},"():\n",[1059,1214,1216,1219,1221,1223,1226,1228,1231,1234,1236],{"class":1061,"line":1215},8,[1059,1217,1218],{"class":1180},"            raise",[1059,1220,1107],{"class":1100},[1059,1222,1088],{"class":1080},[1059,1224,1225],{"class":1112},"ValidationError",[1059,1227,1081],{"class":1080},[1059,1229,1230],{"class":1164},"\"",[1059,1232,1233],{"class":1168},"Email already exists",[1059,1235,1230],{"class":1164},[1059,1237,1238],{"class":1080},")\n",[1059,1240,1242,1245],{"class":1061,"line":1241},9,[1059,1243,1244],{"class":1180},"        return",[1059,1246,1247],{"class":1100}," email\n",[1059,1249,1251],{"class":1061,"line":1250},10,[1059,1252,1254],{"emptyLinePlaceholder":1253},true,"\n",[1059,1256,1258,1260,1263,1265,1267,1269,1271],{"class":1061,"line":1257},11,[1059,1259,1073],{"class":1072},[1059,1261,1262],{"class":1076}," UserRegistrationForm",[1059,1264,1081],{"class":1080},[1059,1266,1085],{"class":1084},[1059,1268,1088],{"class":1080},[1059,1270,1091],{"class":1084},[1059,1272,1094],{"class":1080},[1059,1274,1276,1278,1280,1282,1284,1286],{"class":1061,"line":1275},12,[1059,1277,1101],{"class":1100},[1059,1279,1104],{"class":1080},[1059,1281,1107],{"class":1100},[1059,1283,1088],{"class":1080},[1059,1285,1113],{"class":1112},[1059,1287,1116],{"class":1080},[1059,1289,1291],{"class":1061,"line":1290},13,[1059,1292,1122],{"class":1100},[1059,1294,1296,1298,1300,1302,1304],{"class":1061,"line":1295},14,[1059,1297,1128],{"class":1072},[1059,1299,1132],{"class":1131},[1059,1301,1081],{"class":1080},[1059,1303,1138],{"class":1137},[1059,1305,1094],{"class":1080},[1059,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327],{"class":1061,"line":1308},15,[1059,1310,1146],{"class":1100},[1059,1312,1104],{"class":1080},[1059,1314,1152],{"class":1151},[1059,1316,1088],{"class":1080},[1059,1318,1158],{"class":1157},[1059,1320,1161],{"class":1080},[1059,1322,1165],{"class":1164},[1059,1324,1169],{"class":1168},[1059,1326,1165],{"class":1164},[1059,1328,1174],{"class":1080},[1059,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350,1352,1354,1356,1359],{"class":1061,"line":1331},16,[1059,1333,1181],{"class":1180},[1059,1335,1184],{"class":1100},[1059,1337,1088],{"class":1080},[1059,1339,1189],{"class":1157},[1059,1341,1088],{"class":1080},[1059,1343,1194],{"class":1112},[1059,1345,1081],{"class":1080},[1059,1347,1169],{"class":1199},[1059,1349,1104],{"class":1080},[1059,1351,1169],{"class":1112},[1059,1353,1206],{"class":1080},[1059,1355,1209],{"class":1112},[1059,1357,1358],{"class":1080},"():",[1059,1360,1361],{"class":1065},"  # Repeated logic\n",[1059,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381],{"class":1061,"line":1364},17,[1059,1366,1218],{"class":1180},[1059,1368,1107],{"class":1100},[1059,1370,1088],{"class":1080},[1059,1372,1225],{"class":1112},[1059,1374,1081],{"class":1080},[1059,1376,1230],{"class":1164},[1059,1378,1233],{"class":1168},[1059,1380,1230],{"class":1164},[1059,1382,1238],{"class":1080},[1059,1384,1386,1388],{"class":1061,"line":1385},18,[1059,1387,1244],{"class":1180},[1059,1389,1247],{"class":1100},[1059,1391,1393],{"class":1061,"line":1392},19,[1059,1394,1254],{"emptyLinePlaceholder":1253},[1059,1396,1398],{"class":1061,"line":1397},20,[1059,1399,1400],{"class":1065},"# Good: Centralized validation\n",[1059,1402,1404,1406,1409],{"class":1061,"line":1403},21,[1059,1405,1073],{"class":1072},[1059,1407,1408],{"class":1076}," UniqueEmailMixin",[1059,1410,1411],{"class":1080},":\n",[1059,1413,1415,1417,1419,1421,1423],{"class":1061,"line":1414},22,[1059,1416,1128],{"class":1072},[1059,1418,1132],{"class":1131},[1059,1420,1081],{"class":1080},[1059,1422,1138],{"class":1137},[1059,1424,1094],{"class":1080},[1059,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446],{"class":1061,"line":1427},23,[1059,1429,1146],{"class":1100},[1059,1431,1104],{"class":1080},[1059,1433,1152],{"class":1151},[1059,1435,1088],{"class":1080},[1059,1437,1158],{"class":1157},[1059,1439,1161],{"class":1080},[1059,1441,1165],{"class":1164},[1059,1443,1169],{"class":1168},[1059,1445,1165],{"class":1164},[1059,1447,1174],{"class":1080},[1059,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475],{"class":1061,"line":1450},24,[1059,1452,1181],{"class":1180},[1059,1454,1184],{"class":1100},[1059,1456,1088],{"class":1080},[1059,1458,1189],{"class":1157},[1059,1460,1088],{"class":1080},[1059,1462,1194],{"class":1112},[1059,1464,1081],{"class":1080},[1059,1466,1169],{"class":1199},[1059,1468,1104],{"class":1080},[1059,1470,1169],{"class":1112},[1059,1472,1206],{"class":1080},[1059,1474,1209],{"class":1112},[1059,1476,1212],{"class":1080},[1059,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496],{"class":1061,"line":1479},25,[1059,1481,1218],{"class":1180},[1059,1483,1107],{"class":1100},[1059,1485,1088],{"class":1080},[1059,1487,1225],{"class":1112},[1059,1489,1081],{"class":1080},[1059,1491,1230],{"class":1164},[1059,1493,1233],{"class":1168},[1059,1495,1230],{"class":1164},[1059,1497,1238],{"class":1080},[1059,1499,1501,1503],{"class":1061,"line":1500},26,[1059,1502,1244],{"class":1180},[1059,1504,1247],{"class":1100},[1059,1506,1508],{"class":1061,"line":1507},27,[1059,1509,1254],{"emptyLinePlaceholder":1253},[1059,1511,1513,1515,1517,1519,1522,1525,1527,1529,1531],{"class":1061,"line":1512},28,[1059,1514,1073],{"class":1072},[1059,1516,1077],{"class":1076},[1059,1518,1081],{"class":1080},[1059,1520,1521],{"class":1084},"UniqueEmailMixin",[1059,1523,1524],{"class":1080},",",[1059,1526,1107],{"class":1084},[1059,1528,1088],{"class":1080},[1059,1530,1091],{"class":1084},[1059,1532,1094],{"class":1080},[1059,1534,1536,1538,1540,1542,1544,1546],{"class":1061,"line":1535},29,[1059,1537,1101],{"class":1100},[1059,1539,1104],{"class":1080},[1059,1541,1107],{"class":1100},[1059,1543,1088],{"class":1080},[1059,1545,1113],{"class":1112},[1059,1547,1116],{"class":1080},[1059,1549,1551],{"class":1061,"line":1550},30,[1059,1552,1254],{"emptyLinePlaceholder":1253},[1059,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572],{"class":1061,"line":1555},31,[1059,1557,1073],{"class":1072},[1059,1559,1262],{"class":1076},[1059,1561,1081],{"class":1080},[1059,1563,1521],{"class":1084},[1059,1565,1524],{"class":1080},[1059,1567,1107],{"class":1084},[1059,1569,1088],{"class":1080},[1059,1571,1091],{"class":1084},[1059,1573,1094],{"class":1080},[1059,1575,1577,1579,1581,1583,1585,1587],{"class":1061,"line":1576},32,[1059,1578,1101],{"class":1100},[1059,1580,1104],{"class":1080},[1059,1582,1107],{"class":1100},[1059,1584,1088],{"class":1080},[1059,1586,1113],{"class":1112},[1059,1588,1116],{"class":1080},[1035,1590,1592],{"id":1591},"_2-explicit-is-better-than-implicit","2. Explicit is Better Than Implicit",[1026,1594,1595],{},"Django favors explicit configuration over implicit conventions, making code more readable and maintainable.",[1026,1597,1598],{},[1045,1599,1600],{},"Examples:",[1049,1602,1604],{"className":1051,"code":1603,"language":1053,"meta":1054,"style":1054},"# Explicit URL patterns\nurlpatterns = [\n    path('articles/\u003Cint:year>/\u003Cint:month>/', views.month_archive),\n    path('articles/\u003Cint:article_id>/', views.article_detail),\n]\n\n# Explicit model relationships\nclass Article(models.Model):\n    author = models.ForeignKey(\n        User, \n        on_delete=models.CASCADE,  # Explicit deletion behavior\n        related_name='articles'    # Explicit reverse relationship name\n    )\n    category = models.ForeignKey(\n        'Category',               # Explicit string reference\n        on_delete=models.SET_NULL,\n        null=True,\n        blank=True\n    )\n\n# Explicit template inheritance\n{% extends 'base.html' %}  {# Explicit parent template #}\n{% load static %}          {# Explicit template tag loading #}\n",[1056,1605,1606,1611,1621,1648,1672,1676,1680,1685,1704,1722,1732,1752,1769,1774,1789,1804,1820,1833,1843,1847,1851,1856,1887],{"__ignoreMap":1054},[1059,1607,1608],{"class":1061,"line":1062},[1059,1609,1610],{"class":1065},"# Explicit URL patterns\n",[1059,1612,1613,1616,1618],{"class":1061,"line":1069},[1059,1614,1615],{"class":1100},"urlpatterns ",[1059,1617,1104],{"class":1080},[1059,1619,1620],{"class":1080}," [\n",[1059,1622,1623,1626,1628,1630,1633,1635,1637,1640,1642,1645],{"class":1061,"line":1097},[1059,1624,1625],{"class":1112},"    path",[1059,1627,1081],{"class":1080},[1059,1629,1165],{"class":1164},[1059,1631,1632],{"class":1168},"articles/\u003Cint:year>/\u003Cint:month>/",[1059,1634,1165],{"class":1164},[1059,1636,1524],{"class":1080},[1059,1638,1639],{"class":1112}," views",[1059,1641,1088],{"class":1080},[1059,1643,1644],{"class":1157},"month_archive",[1059,1646,1647],{"class":1080},"),\n",[1059,1649,1650,1652,1654,1656,1659,1661,1663,1665,1667,1670],{"class":1061,"line":1119},[1059,1651,1625],{"class":1112},[1059,1653,1081],{"class":1080},[1059,1655,1165],{"class":1164},[1059,1657,1658],{"class":1168},"articles/\u003Cint:article_id>/",[1059,1660,1165],{"class":1164},[1059,1662,1524],{"class":1080},[1059,1664,1639],{"class":1112},[1059,1666,1088],{"class":1080},[1059,1668,1669],{"class":1157},"article_detail",[1059,1671,1647],{"class":1080},[1059,1673,1674],{"class":1061,"line":1125},[1059,1675,1174],{"class":1080},[1059,1677,1678],{"class":1061,"line":1143},[1059,1679,1254],{"emptyLinePlaceholder":1253},[1059,1681,1682],{"class":1061,"line":1177},[1059,1683,1684],{"class":1065},"# Explicit model relationships\n",[1059,1686,1687,1689,1692,1694,1697,1699,1702],{"class":1061,"line":1215},[1059,1688,1073],{"class":1072},[1059,1690,1691],{"class":1076}," Article",[1059,1693,1081],{"class":1080},[1059,1695,1696],{"class":1084},"models",[1059,1698,1088],{"class":1080},[1059,1700,1701],{"class":1084},"Model",[1059,1703,1094],{"class":1080},[1059,1705,1706,1709,1711,1714,1716,1719],{"class":1061,"line":1241},[1059,1707,1708],{"class":1100},"    author ",[1059,1710,1104],{"class":1080},[1059,1712,1713],{"class":1100}," models",[1059,1715,1088],{"class":1080},[1059,1717,1718],{"class":1112},"ForeignKey",[1059,1720,1721],{"class":1080},"(\n",[1059,1723,1724,1727,1729],{"class":1061,"line":1250},[1059,1725,1726],{"class":1112},"        User",[1059,1728,1524],{"class":1080},[1059,1730,1731],{"class":1112}," \n",[1059,1733,1734,1737,1739,1741,1743,1747,1749],{"class":1061,"line":1257},[1059,1735,1736],{"class":1199},"        on_delete",[1059,1738,1104],{"class":1080},[1059,1740,1696],{"class":1112},[1059,1742,1088],{"class":1080},[1059,1744,1746],{"class":1745},"sFGJz","CASCADE",[1059,1748,1524],{"class":1080},[1059,1750,1751],{"class":1065},"  # Explicit deletion behavior\n",[1059,1753,1754,1757,1759,1761,1764,1766],{"class":1061,"line":1275},[1059,1755,1756],{"class":1199},"        related_name",[1059,1758,1104],{"class":1080},[1059,1760,1165],{"class":1164},[1059,1762,1763],{"class":1168},"articles",[1059,1765,1165],{"class":1164},[1059,1767,1768],{"class":1065},"    # Explicit reverse relationship name\n",[1059,1770,1771],{"class":1061,"line":1290},[1059,1772,1773],{"class":1080},"    )\n",[1059,1775,1776,1779,1781,1783,1785,1787],{"class":1061,"line":1295},[1059,1777,1778],{"class":1100},"    category ",[1059,1780,1104],{"class":1080},[1059,1782,1713],{"class":1100},[1059,1784,1088],{"class":1080},[1059,1786,1718],{"class":1112},[1059,1788,1721],{"class":1080},[1059,1790,1791,1794,1797,1799,1801],{"class":1061,"line":1308},[1059,1792,1793],{"class":1164},"        '",[1059,1795,1796],{"class":1168},"Category",[1059,1798,1165],{"class":1164},[1059,1800,1524],{"class":1080},[1059,1802,1803],{"class":1065},"               # Explicit string reference\n",[1059,1805,1806,1808,1810,1812,1814,1817],{"class":1061,"line":1331},[1059,1807,1736],{"class":1199},[1059,1809,1104],{"class":1080},[1059,1811,1696],{"class":1112},[1059,1813,1088],{"class":1080},[1059,1815,1816],{"class":1745},"SET_NULL",[1059,1818,1819],{"class":1080},",\n",[1059,1821,1822,1825,1827,1831],{"class":1061,"line":1364},[1059,1823,1824],{"class":1199},"        null",[1059,1826,1104],{"class":1080},[1059,1828,1830],{"class":1829},"s8XtY","True",[1059,1832,1819],{"class":1080},[1059,1834,1835,1838,1840],{"class":1061,"line":1385},[1059,1836,1837],{"class":1199},"        blank",[1059,1839,1104],{"class":1080},[1059,1841,1842],{"class":1829},"True\n",[1059,1844,1845],{"class":1061,"line":1392},[1059,1846,1773],{"class":1080},[1059,1848,1849],{"class":1061,"line":1397},[1059,1850,1254],{"emptyLinePlaceholder":1253},[1059,1852,1853],{"class":1061,"line":1403},[1059,1854,1855],{"class":1065},"# Explicit template inheritance\n",[1059,1857,1858,1861,1865,1868,1870,1873,1875,1878,1881,1884],{"class":1061,"line":1414},[1059,1859,1860],{"class":1080},"{",[1059,1862,1864],{"class":1863},"sVsLi","%",[1059,1866,1867],{"class":1100}," extends ",[1059,1869,1165],{"class":1164},[1059,1871,1872],{"class":1168},"base.html",[1059,1874,1165],{"class":1164},[1059,1876,1877],{"class":1863}," %",[1059,1879,1880],{"class":1080},"}",[1059,1882,1883],{"class":1080},"  {",[1059,1885,1886],{"class":1065},"# Explicit parent template #}\n",[1059,1888,1889,1891,1893,1896,1898,1900,1903],{"class":1061,"line":1427},[1059,1890,1860],{"class":1080},[1059,1892,1864],{"class":1863},[1059,1894,1895],{"class":1100}," load static ",[1059,1897,1864],{"class":1863},[1059,1899,1880],{"class":1080},[1059,1901,1902],{"class":1080},"          {",[1059,1904,1905],{"class":1065},"# Explicit template tag loading #}\n",[1035,1907,1909],{"id":1908},"_3-loose-coupling","3. Loose Coupling",[1026,1911,1912],{},"Django's components should have minimal knowledge of each other, promoting reusability and maintainability.",[1026,1914,1915],{},[1045,1916,1917],{},"Implementation:",[1049,1919,1921],{"className":1051,"code":1920,"language":1053,"meta":1054,"style":1054},"# Loose coupling through signals\nfrom django.db.models.signals import post_save\nfrom django.dispatch import receiver\n\n@receiver(post_save, sender=User)\ndef create_user_profile(sender, instance, created, **kwargs):\n    if created:\n        UserProfile.objects.create(user=instance)\n\n# Loose coupling through dependency injection\nclass EmailService:\n    def send_notification(self, user, message):\n        # Email sending logic\n        pass\n\nclass SMSService:\n    def send_notification(self, user, message):\n        # SMS sending logic\n        pass\n\nclass NotificationManager:\n    def __init__(self, service):\n        self.service = service  # Injected dependency\n    \n    def notify_user(self, user, message):\n        self.service.send_notification(user, message)\n",[1056,1922,1923,1928,1956,1972,1976,2001,2035,2044,2070,2074,2079,2088,2111,2116,2121,2125,2134,2154,2159,2163,2167,2176,2195,2214,2218,2239],{"__ignoreMap":1054},[1059,1924,1925],{"class":1061,"line":1062},[1059,1926,1927],{"class":1065},"# Loose coupling through signals\n",[1059,1929,1930,1933,1936,1938,1941,1943,1945,1947,1950,1953],{"class":1061,"line":1069},[1059,1931,1932],{"class":1180},"from",[1059,1934,1935],{"class":1100}," django",[1059,1937,1088],{"class":1080},[1059,1939,1940],{"class":1100},"db",[1059,1942,1088],{"class":1080},[1059,1944,1696],{"class":1100},[1059,1946,1088],{"class":1080},[1059,1948,1949],{"class":1100},"signals ",[1059,1951,1952],{"class":1180},"import",[1059,1954,1955],{"class":1100}," post_save\n",[1059,1957,1958,1960,1962,1964,1967,1969],{"class":1061,"line":1097},[1059,1959,1932],{"class":1180},[1059,1961,1935],{"class":1100},[1059,1963,1088],{"class":1080},[1059,1965,1966],{"class":1100},"dispatch ",[1059,1968,1952],{"class":1180},[1059,1970,1971],{"class":1100}," receiver\n",[1059,1973,1974],{"class":1061,"line":1119},[1059,1975,1254],{"emptyLinePlaceholder":1253},[1059,1977,1978,1981,1984,1986,1989,1991,1994,1996,1999],{"class":1061,"line":1125},[1059,1979,1980],{"class":1080},"@",[1059,1982,1983],{"class":1131},"receiver",[1059,1985,1081],{"class":1080},[1059,1987,1988],{"class":1112},"post_save",[1059,1990,1524],{"class":1080},[1059,1992,1993],{"class":1199}," sender",[1059,1995,1104],{"class":1080},[1059,1997,1998],{"class":1112},"User",[1059,2000,1238],{"class":1080},[1059,2002,2003,2006,2009,2011,2015,2017,2020,2022,2025,2027,2030,2033],{"class":1061,"line":1143},[1059,2004,2005],{"class":1072},"def",[1059,2007,2008],{"class":1131}," create_user_profile",[1059,2010,1081],{"class":1080},[1059,2012,2014],{"class":2013},"sCyAa","sender",[1059,2016,1524],{"class":1080},[1059,2018,2019],{"class":2013}," instance",[1059,2021,1524],{"class":1080},[1059,2023,2024],{"class":2013}," created",[1059,2026,1524],{"class":1080},[1059,2028,2029],{"class":1863}," **",[1059,2031,2032],{"class":2013},"kwargs",[1059,2034,1094],{"class":1080},[1059,2036,2037,2040,2042],{"class":1061,"line":1177},[1059,2038,2039],{"class":1180},"    if",[1059,2041,2024],{"class":1100},[1059,2043,1411],{"class":1080},[1059,2045,2046,2049,2051,2053,2055,2058,2060,2063,2065,2068],{"class":1061,"line":1215},[1059,2047,2048],{"class":1100},"        UserProfile",[1059,2050,1088],{"class":1080},[1059,2052,1189],{"class":1157},[1059,2054,1088],{"class":1080},[1059,2056,2057],{"class":1112},"create",[1059,2059,1081],{"class":1080},[1059,2061,2062],{"class":1199},"user",[1059,2064,1104],{"class":1080},[1059,2066,2067],{"class":1112},"instance",[1059,2069,1238],{"class":1080},[1059,2071,2072],{"class":1061,"line":1241},[1059,2073,1254],{"emptyLinePlaceholder":1253},[1059,2075,2076],{"class":1061,"line":1250},[1059,2077,2078],{"class":1065},"# Loose coupling through dependency injection\n",[1059,2080,2081,2083,2086],{"class":1061,"line":1257},[1059,2082,1073],{"class":1072},[1059,2084,2085],{"class":1076}," EmailService",[1059,2087,1411],{"class":1080},[1059,2089,2090,2092,2095,2097,2099,2101,2104,2106,2109],{"class":1061,"line":1275},[1059,2091,1128],{"class":1072},[1059,2093,2094],{"class":1131}," send_notification",[1059,2096,1081],{"class":1080},[1059,2098,1138],{"class":1137},[1059,2100,1524],{"class":1080},[1059,2102,2103],{"class":2013}," user",[1059,2105,1524],{"class":1080},[1059,2107,2108],{"class":2013}," message",[1059,2110,1094],{"class":1080},[1059,2112,2113],{"class":1061,"line":1290},[1059,2114,2115],{"class":1065},"        # Email sending logic\n",[1059,2117,2118],{"class":1061,"line":1295},[1059,2119,2120],{"class":1180},"        pass\n",[1059,2122,2123],{"class":1061,"line":1308},[1059,2124,1254],{"emptyLinePlaceholder":1253},[1059,2126,2127,2129,2132],{"class":1061,"line":1331},[1059,2128,1073],{"class":1072},[1059,2130,2131],{"class":1076}," SMSService",[1059,2133,1411],{"class":1080},[1059,2135,2136,2138,2140,2142,2144,2146,2148,2150,2152],{"class":1061,"line":1364},[1059,2137,1128],{"class":1072},[1059,2139,2094],{"class":1131},[1059,2141,1081],{"class":1080},[1059,2143,1138],{"class":1137},[1059,2145,1524],{"class":1080},[1059,2147,2103],{"class":2013},[1059,2149,1524],{"class":1080},[1059,2151,2108],{"class":2013},[1059,2153,1094],{"class":1080},[1059,2155,2156],{"class":1061,"line":1385},[1059,2157,2158],{"class":1065},"        # SMS sending logic\n",[1059,2160,2161],{"class":1061,"line":1392},[1059,2162,2120],{"class":1180},[1059,2164,2165],{"class":1061,"line":1397},[1059,2166,1254],{"emptyLinePlaceholder":1253},[1059,2168,2169,2171,2174],{"class":1061,"line":1403},[1059,2170,1073],{"class":1072},[1059,2172,2173],{"class":1076}," NotificationManager",[1059,2175,1411],{"class":1080},[1059,2177,2178,2180,2184,2186,2188,2190,2193],{"class":1061,"line":1414},[1059,2179,1128],{"class":1072},[1059,2181,2183],{"class":2182},"sJdAF"," __init__",[1059,2185,1081],{"class":1080},[1059,2187,1138],{"class":1137},[1059,2189,1524],{"class":1080},[1059,2191,2192],{"class":2013}," service",[1059,2194,1094],{"class":1080},[1059,2196,2197,2200,2202,2205,2208,2211],{"class":1061,"line":1427},[1059,2198,2199],{"class":1151},"        self",[1059,2201,1088],{"class":1080},[1059,2203,2204],{"class":1157},"service",[1059,2206,2207],{"class":1080}," =",[1059,2209,2210],{"class":1100}," service  ",[1059,2212,2213],{"class":1065},"# Injected dependency\n",[1059,2215,2216],{"class":1061,"line":1450},[1059,2217,1122],{"class":1100},[1059,2219,2220,2222,2225,2227,2229,2231,2233,2235,2237],{"class":1061,"line":1479},[1059,2221,1128],{"class":1072},[1059,2223,2224],{"class":1131}," notify_user",[1059,2226,1081],{"class":1080},[1059,2228,1138],{"class":1137},[1059,2230,1524],{"class":1080},[1059,2232,2103],{"class":2013},[1059,2234,1524],{"class":1080},[1059,2236,2108],{"class":2013},[1059,2238,1094],{"class":1080},[1059,2240,2241,2243,2245,2247,2249,2252,2254,2256,2258,2260],{"class":1061,"line":1500},[1059,2242,2199],{"class":1151},[1059,2244,1088],{"class":1080},[1059,2246,2204],{"class":1157},[1059,2248,1088],{"class":1080},[1059,2250,2251],{"class":1112},"send_notification",[1059,2253,1081],{"class":1080},[1059,2255,2062],{"class":1112},[1059,2257,1524],{"class":1080},[1059,2259,2108],{"class":1112},[1059,2261,1238],{"class":1080},[1035,2263,2265],{"id":2264},"_4-less-code","4. Less Code",[1026,2267,2268],{},"Django should require as little code as possible and make use of Python's dynamic capabilities.",[1026,2270,2271],{},[1045,2272,1600],{},[1049,2274,2276],{"className":1051,"code":2275,"language":1053,"meta":1054,"style":1054},"# Minimal model definition with maximum functionality\nclass BlogPost(models.Model):\n    title = models.CharField(max_length=200)\n    content = models.TextField()\n    author = models.ForeignKey(User, on_delete=models.CASCADE)\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    def __str__(self):\n        return self.title\n    \n    class Meta:\n        ordering = ['-created_at']\n\n# Automatic admin interface\nadmin.site.register(BlogPost)\n\n# Generic views reduce boilerplate\nclass PostListView(ListView):\n    model = BlogPost\n    template_name = 'blog/post_list.html'\n    context_object_name = 'posts'\n    paginate_by = 10\n",[1056,2277,2278,2283,2300,2327,2343,2374,2399,2403,2416,2427,2431,2441,2460,2464,2469,2491,2495,2500,2514,2524,2540,2554],{"__ignoreMap":1054},[1059,2279,2280],{"class":1061,"line":1062},[1059,2281,2282],{"class":1065},"# Minimal model definition with maximum functionality\n",[1059,2284,2285,2287,2290,2292,2294,2296,2298],{"class":1061,"line":1069},[1059,2286,1073],{"class":1072},[1059,2288,2289],{"class":1076}," BlogPost",[1059,2291,1081],{"class":1080},[1059,2293,1696],{"class":1084},[1059,2295,1088],{"class":1080},[1059,2297,1701],{"class":1084},[1059,2299,1094],{"class":1080},[1059,2301,2302,2305,2307,2309,2311,2314,2316,2319,2321,2325],{"class":1061,"line":1097},[1059,2303,2304],{"class":1100},"    title ",[1059,2306,1104],{"class":1080},[1059,2308,1713],{"class":1100},[1059,2310,1088],{"class":1080},[1059,2312,2313],{"class":1112},"CharField",[1059,2315,1081],{"class":1080},[1059,2317,2318],{"class":1199},"max_length",[1059,2320,1104],{"class":1080},[1059,2322,2324],{"class":2323},"s7CZa","200",[1059,2326,1238],{"class":1080},[1059,2328,2329,2332,2334,2336,2338,2341],{"class":1061,"line":1119},[1059,2330,2331],{"class":1100},"    content ",[1059,2333,1104],{"class":1080},[1059,2335,1713],{"class":1100},[1059,2337,1088],{"class":1080},[1059,2339,2340],{"class":1112},"TextField",[1059,2342,1116],{"class":1080},[1059,2344,2345,2347,2349,2351,2353,2355,2357,2359,2361,2364,2366,2368,2370,2372],{"class":1061,"line":1125},[1059,2346,1708],{"class":1100},[1059,2348,1104],{"class":1080},[1059,2350,1713],{"class":1100},[1059,2352,1088],{"class":1080},[1059,2354,1718],{"class":1112},[1059,2356,1081],{"class":1080},[1059,2358,1998],{"class":1112},[1059,2360,1524],{"class":1080},[1059,2362,2363],{"class":1199}," on_delete",[1059,2365,1104],{"class":1080},[1059,2367,1696],{"class":1112},[1059,2369,1088],{"class":1080},[1059,2371,1746],{"class":1745},[1059,2373,1238],{"class":1080},[1059,2375,2376,2379,2381,2383,2385,2388,2390,2393,2395,2397],{"class":1061,"line":1143},[1059,2377,2378],{"class":1100},"    created_at ",[1059,2380,1104],{"class":1080},[1059,2382,1713],{"class":1100},[1059,2384,1088],{"class":1080},[1059,2386,2387],{"class":1112},"DateTimeField",[1059,2389,1081],{"class":1080},[1059,2391,2392],{"class":1199},"auto_now_add",[1059,2394,1104],{"class":1080},[1059,2396,1830],{"class":1829},[1059,2398,1238],{"class":1080},[1059,2400,2401],{"class":1061,"line":1177},[1059,2402,1122],{"class":1100},[1059,2404,2405,2407,2410,2412,2414],{"class":1061,"line":1215},[1059,2406,1128],{"class":1072},[1059,2408,2409],{"class":2182}," __str__",[1059,2411,1081],{"class":1080},[1059,2413,1138],{"class":1137},[1059,2415,1094],{"class":1080},[1059,2417,2418,2420,2422,2424],{"class":1061,"line":1241},[1059,2419,1244],{"class":1180},[1059,2421,1152],{"class":1151},[1059,2423,1088],{"class":1080},[1059,2425,2426],{"class":1157},"title\n",[1059,2428,2429],{"class":1061,"line":1250},[1059,2430,1122],{"class":1100},[1059,2432,2433,2436,2439],{"class":1061,"line":1257},[1059,2434,2435],{"class":1072},"    class",[1059,2437,2438],{"class":1076}," Meta",[1059,2440,1411],{"class":1080},[1059,2442,2443,2446,2448,2451,2453,2456,2458],{"class":1061,"line":1275},[1059,2444,2445],{"class":1100},"        ordering ",[1059,2447,1104],{"class":1080},[1059,2449,2450],{"class":1080}," [",[1059,2452,1165],{"class":1164},[1059,2454,2455],{"class":1168},"-created_at",[1059,2457,1165],{"class":1164},[1059,2459,1174],{"class":1080},[1059,2461,2462],{"class":1061,"line":1290},[1059,2463,1254],{"emptyLinePlaceholder":1253},[1059,2465,2466],{"class":1061,"line":1295},[1059,2467,2468],{"class":1065},"# Automatic admin interface\n",[1059,2470,2471,2474,2476,2479,2481,2484,2486,2489],{"class":1061,"line":1308},[1059,2472,2473],{"class":1100},"admin",[1059,2475,1088],{"class":1080},[1059,2477,2478],{"class":1157},"site",[1059,2480,1088],{"class":1080},[1059,2482,2483],{"class":1112},"register",[1059,2485,1081],{"class":1080},[1059,2487,2488],{"class":1112},"BlogPost",[1059,2490,1238],{"class":1080},[1059,2492,2493],{"class":1061,"line":1331},[1059,2494,1254],{"emptyLinePlaceholder":1253},[1059,2496,2497],{"class":1061,"line":1364},[1059,2498,2499],{"class":1065},"# Generic views reduce boilerplate\n",[1059,2501,2502,2504,2507,2509,2512],{"class":1061,"line":1385},[1059,2503,1073],{"class":1072},[1059,2505,2506],{"class":1076}," PostListView",[1059,2508,1081],{"class":1080},[1059,2510,2511],{"class":1084},"ListView",[1059,2513,1094],{"class":1080},[1059,2515,2516,2519,2521],{"class":1061,"line":1392},[1059,2517,2518],{"class":1100},"    model ",[1059,2520,1104],{"class":1080},[1059,2522,2523],{"class":1100}," BlogPost\n",[1059,2525,2526,2529,2531,2534,2537],{"class":1061,"line":1397},[1059,2527,2528],{"class":1100},"    template_name ",[1059,2530,1104],{"class":1080},[1059,2532,2533],{"class":1164}," '",[1059,2535,2536],{"class":1168},"blog/post_list.html",[1059,2538,2539],{"class":1164},"'\n",[1059,2541,2542,2545,2547,2549,2552],{"class":1061,"line":1403},[1059,2543,2544],{"class":1100},"    context_object_name ",[1059,2546,1104],{"class":1080},[1059,2548,2533],{"class":1164},[1059,2550,2551],{"class":1168},"posts",[1059,2553,2539],{"class":1164},[1059,2555,2556,2559,2561],{"class":1061,"line":1414},[1059,2557,2558],{"class":1100},"    paginate_by ",[1059,2560,1104],{"class":1080},[1059,2562,2563],{"class":2323}," 10\n",[1030,2565,2567],{"id":2566},"core-architectural-concepts","Core Architectural Concepts",[1035,2569,2571],{"id":2570},"model-view-template-mvt-pattern","Model-View-Template (MVT) Pattern",[1026,2573,2574],{},"Django uses MVT, a variation of the Model-View-Controller (MVC) pattern:",[1049,2576,2578],{"className":1051,"code":2577,"language":1053,"meta":1054,"style":1054},"# MODEL: Data layer and business logic\nclass Product(models.Model):\n    name = models.CharField(max_length=100)\n    price = models.DecimalField(max_digits=10, decimal_places=2)\n    description = models.TextField()\n    in_stock = models.BooleanField(default=True)\n    \n    def get_discounted_price(self, discount_percent):\n        \"\"\"Business logic in the model\"\"\"\n        return self.price * (1 - discount_percent / 100)\n    \n    @property\n    def is_expensive(self):\n        return self.price > 100\n\n# VIEW: Request processing and response logic\nfrom django.shortcuts import render, get_object_or_404\nfrom django.http import JsonResponse\n\ndef product_list(request):\n    \"\"\"Function-based view\"\"\"\n    products = Product.objects.filter(in_stock=True)\n    context = {'products': products}\n    return render(request, 'products/list.html', context)\n\nclass ProductDetailView(DetailView):\n    \"\"\"Class-based view\"\"\"\n    model = Product\n    template_name = 'products/detail.html'\n    context_object_name = 'product'\n\ndef product_api(request, product_id):\n    \"\"\"API view returning JSON\"\"\"\n    product = get_object_or_404(Product, id=product_id)\n    data = {\n        'name': product.name,\n        'price': str(product.price),\n        'in_stock': product.in_stock\n    }\n    return JsonResponse(data)\n\n# TEMPLATE: Presentation layer\n# products/list.html\n{% extends 'base.html' %}\n\n{% block content %}\n    \u003Ch1>Products\u003C/h1>\n    {% for product in products %}\n        \u003Cdiv class=\"product-card\">\n            \u003Ch3>{{ product.name }}\u003C/h3>\n            \u003Cp>${{ product.price }}\u003C/p>\n            {% if product.is_expensive %}\n                \u003Cspan class=\"badge\">Premium\u003C/span>\n            {% endif %}\n        \u003C/div>\n    {% endfor %}\n{% endblock %}\n",[1056,2579,2580,2585,2602,2626,2662,2677,2702,2706,2724,2737,2771,2775,2784,2797,2813,2817,2822,2843,2859,2863,2877,2887,2915,2941,2968,2972,2986,2995,3004,3017,3030,3034,3052,3062,3090,3101,3122,3146,3164,3170,3185,3190,3196,3202,3221,3226,3240,3262,3286,3308,3336,3365,3387,3418,3432,3443,3457],{"__ignoreMap":1054},[1059,2581,2582],{"class":1061,"line":1062},[1059,2583,2584],{"class":1065},"# MODEL: Data layer and business logic\n",[1059,2586,2587,2589,2592,2594,2596,2598,2600],{"class":1061,"line":1069},[1059,2588,1073],{"class":1072},[1059,2590,2591],{"class":1076}," Product",[1059,2593,1081],{"class":1080},[1059,2595,1696],{"class":1084},[1059,2597,1088],{"class":1080},[1059,2599,1701],{"class":1084},[1059,2601,1094],{"class":1080},[1059,2603,2604,2607,2609,2611,2613,2615,2617,2619,2621,2624],{"class":1061,"line":1097},[1059,2605,2606],{"class":1100},"    name ",[1059,2608,1104],{"class":1080},[1059,2610,1713],{"class":1100},[1059,2612,1088],{"class":1080},[1059,2614,2313],{"class":1112},[1059,2616,1081],{"class":1080},[1059,2618,2318],{"class":1199},[1059,2620,1104],{"class":1080},[1059,2622,2623],{"class":2323},"100",[1059,2625,1238],{"class":1080},[1059,2627,2628,2631,2633,2635,2637,2640,2642,2645,2647,2650,2652,2655,2657,2660],{"class":1061,"line":1119},[1059,2629,2630],{"class":1100},"    price ",[1059,2632,1104],{"class":1080},[1059,2634,1713],{"class":1100},[1059,2636,1088],{"class":1080},[1059,2638,2639],{"class":1112},"DecimalField",[1059,2641,1081],{"class":1080},[1059,2643,2644],{"class":1199},"max_digits",[1059,2646,1104],{"class":1080},[1059,2648,2649],{"class":2323},"10",[1059,2651,1524],{"class":1080},[1059,2653,2654],{"class":1199}," decimal_places",[1059,2656,1104],{"class":1080},[1059,2658,2659],{"class":2323},"2",[1059,2661,1238],{"class":1080},[1059,2663,2664,2667,2669,2671,2673,2675],{"class":1061,"line":1125},[1059,2665,2666],{"class":1100},"    description ",[1059,2668,1104],{"class":1080},[1059,2670,1713],{"class":1100},[1059,2672,1088],{"class":1080},[1059,2674,2340],{"class":1112},[1059,2676,1116],{"class":1080},[1059,2678,2679,2682,2684,2686,2688,2691,2693,2696,2698,2700],{"class":1061,"line":1143},[1059,2680,2681],{"class":1100},"    in_stock ",[1059,2683,1104],{"class":1080},[1059,2685,1713],{"class":1100},[1059,2687,1088],{"class":1080},[1059,2689,2690],{"class":1112},"BooleanField",[1059,2692,1081],{"class":1080},[1059,2694,2695],{"class":1199},"default",[1059,2697,1104],{"class":1080},[1059,2699,1830],{"class":1829},[1059,2701,1238],{"class":1080},[1059,2703,2704],{"class":1061,"line":1177},[1059,2705,1122],{"class":1100},[1059,2707,2708,2710,2713,2715,2717,2719,2722],{"class":1061,"line":1215},[1059,2709,1128],{"class":1072},[1059,2711,2712],{"class":1131}," get_discounted_price",[1059,2714,1081],{"class":1080},[1059,2716,1138],{"class":1137},[1059,2718,1524],{"class":1080},[1059,2720,2721],{"class":2013}," discount_percent",[1059,2723,1094],{"class":1080},[1059,2725,2726,2730,2734],{"class":1061,"line":1241},[1059,2727,2729],{"class":2728},"sm7ve","        \"\"\"",[1059,2731,2733],{"class":2732},"sVyVU","Business logic in the model",[1059,2735,2736],{"class":2728},"\"\"\"\n",[1059,2738,2739,2741,2743,2745,2748,2751,2754,2757,2760,2763,2766,2769],{"class":1061,"line":1250},[1059,2740,1244],{"class":1180},[1059,2742,1152],{"class":1151},[1059,2744,1088],{"class":1080},[1059,2746,2747],{"class":1157},"price",[1059,2749,2750],{"class":1863}," *",[1059,2752,2753],{"class":1080}," (",[1059,2755,2756],{"class":2323},"1",[1059,2758,2759],{"class":1863}," -",[1059,2761,2762],{"class":1100}," discount_percent ",[1059,2764,2765],{"class":1863},"/",[1059,2767,2768],{"class":2323}," 100",[1059,2770,1238],{"class":1080},[1059,2772,2773],{"class":1061,"line":1257},[1059,2774,1122],{"class":1100},[1059,2776,2777,2780],{"class":1061,"line":1275},[1059,2778,2779],{"class":1080},"    @",[1059,2781,2783],{"class":2782},"sa2tF","property\n",[1059,2785,2786,2788,2791,2793,2795],{"class":1061,"line":1290},[1059,2787,1128],{"class":1072},[1059,2789,2790],{"class":1131}," is_expensive",[1059,2792,1081],{"class":1080},[1059,2794,1138],{"class":1137},[1059,2796,1094],{"class":1080},[1059,2798,2799,2801,2803,2805,2807,2810],{"class":1061,"line":1295},[1059,2800,1244],{"class":1180},[1059,2802,1152],{"class":1151},[1059,2804,1088],{"class":1080},[1059,2806,2747],{"class":1157},[1059,2808,2809],{"class":1863}," >",[1059,2811,2812],{"class":2323}," 100\n",[1059,2814,2815],{"class":1061,"line":1308},[1059,2816,1254],{"emptyLinePlaceholder":1253},[1059,2818,2819],{"class":1061,"line":1331},[1059,2820,2821],{"class":1065},"# VIEW: Request processing and response logic\n",[1059,2823,2824,2826,2828,2830,2833,2835,2838,2840],{"class":1061,"line":1364},[1059,2825,1932],{"class":1180},[1059,2827,1935],{"class":1100},[1059,2829,1088],{"class":1080},[1059,2831,2832],{"class":1100},"shortcuts ",[1059,2834,1952],{"class":1180},[1059,2836,2837],{"class":1100}," render",[1059,2839,1524],{"class":1080},[1059,2841,2842],{"class":1100}," get_object_or_404\n",[1059,2844,2845,2847,2849,2851,2854,2856],{"class":1061,"line":1385},[1059,2846,1932],{"class":1180},[1059,2848,1935],{"class":1100},[1059,2850,1088],{"class":1080},[1059,2852,2853],{"class":1100},"http ",[1059,2855,1952],{"class":1180},[1059,2857,2858],{"class":1100}," JsonResponse\n",[1059,2860,2861],{"class":1061,"line":1392},[1059,2862,1254],{"emptyLinePlaceholder":1253},[1059,2864,2865,2867,2870,2872,2875],{"class":1061,"line":1397},[1059,2866,2005],{"class":1072},[1059,2868,2869],{"class":1131}," product_list",[1059,2871,1081],{"class":1080},[1059,2873,2874],{"class":2013},"request",[1059,2876,1094],{"class":1080},[1059,2878,2879,2882,2885],{"class":1061,"line":1403},[1059,2880,2881],{"class":2728},"    \"\"\"",[1059,2883,2884],{"class":2732},"Function-based view",[1059,2886,2736],{"class":2728},[1059,2888,2889,2892,2894,2896,2898,2900,2902,2904,2906,2909,2911,2913],{"class":1061,"line":1414},[1059,2890,2891],{"class":1100},"    products ",[1059,2893,1104],{"class":1080},[1059,2895,2591],{"class":1100},[1059,2897,1088],{"class":1080},[1059,2899,1189],{"class":1157},[1059,2901,1088],{"class":1080},[1059,2903,1194],{"class":1112},[1059,2905,1081],{"class":1080},[1059,2907,2908],{"class":1199},"in_stock",[1059,2910,1104],{"class":1080},[1059,2912,1830],{"class":1829},[1059,2914,1238],{"class":1080},[1059,2916,2917,2920,2922,2925,2927,2930,2932,2935,2938],{"class":1061,"line":1427},[1059,2918,2919],{"class":1100},"    context ",[1059,2921,1104],{"class":1080},[1059,2923,2924],{"class":1080}," {",[1059,2926,1165],{"class":1164},[1059,2928,2929],{"class":1168},"products",[1059,2931,1165],{"class":1164},[1059,2933,2934],{"class":1080},":",[1059,2936,2937],{"class":1100}," products",[1059,2939,2940],{"class":1080},"}\n",[1059,2942,2943,2946,2948,2950,2952,2954,2956,2959,2961,2963,2966],{"class":1061,"line":1450},[1059,2944,2945],{"class":1180},"    return",[1059,2947,2837],{"class":1112},[1059,2949,1081],{"class":1080},[1059,2951,2874],{"class":1112},[1059,2953,1524],{"class":1080},[1059,2955,2533],{"class":1164},[1059,2957,2958],{"class":1168},"products/list.html",[1059,2960,1165],{"class":1164},[1059,2962,1524],{"class":1080},[1059,2964,2965],{"class":1112}," context",[1059,2967,1238],{"class":1080},[1059,2969,2970],{"class":1061,"line":1479},[1059,2971,1254],{"emptyLinePlaceholder":1253},[1059,2973,2974,2976,2979,2981,2984],{"class":1061,"line":1500},[1059,2975,1073],{"class":1072},[1059,2977,2978],{"class":1076}," ProductDetailView",[1059,2980,1081],{"class":1080},[1059,2982,2983],{"class":1084},"DetailView",[1059,2985,1094],{"class":1080},[1059,2987,2988,2990,2993],{"class":1061,"line":1507},[1059,2989,2881],{"class":2728},[1059,2991,2992],{"class":2732},"Class-based view",[1059,2994,2736],{"class":2728},[1059,2996,2997,2999,3001],{"class":1061,"line":1512},[1059,2998,2518],{"class":1100},[1059,3000,1104],{"class":1080},[1059,3002,3003],{"class":1100}," Product\n",[1059,3005,3006,3008,3010,3012,3015],{"class":1061,"line":1535},[1059,3007,2528],{"class":1100},[1059,3009,1104],{"class":1080},[1059,3011,2533],{"class":1164},[1059,3013,3014],{"class":1168},"products/detail.html",[1059,3016,2539],{"class":1164},[1059,3018,3019,3021,3023,3025,3028],{"class":1061,"line":1550},[1059,3020,2544],{"class":1100},[1059,3022,1104],{"class":1080},[1059,3024,2533],{"class":1164},[1059,3026,3027],{"class":1168},"product",[1059,3029,2539],{"class":1164},[1059,3031,3032],{"class":1061,"line":1555},[1059,3033,1254],{"emptyLinePlaceholder":1253},[1059,3035,3036,3038,3041,3043,3045,3047,3050],{"class":1061,"line":1576},[1059,3037,2005],{"class":1072},[1059,3039,3040],{"class":1131}," product_api",[1059,3042,1081],{"class":1080},[1059,3044,2874],{"class":2013},[1059,3046,1524],{"class":1080},[1059,3048,3049],{"class":2013}," product_id",[1059,3051,1094],{"class":1080},[1059,3053,3055,3057,3060],{"class":1061,"line":3054},33,[1059,3056,2881],{"class":2728},[1059,3058,3059],{"class":2732},"API view returning JSON",[1059,3061,2736],{"class":2728},[1059,3063,3065,3068,3070,3073,3075,3078,3080,3083,3085,3088],{"class":1061,"line":3064},34,[1059,3066,3067],{"class":1100},"    product ",[1059,3069,1104],{"class":1080},[1059,3071,3072],{"class":1112}," get_object_or_404",[1059,3074,1081],{"class":1080},[1059,3076,3077],{"class":1112},"Product",[1059,3079,1524],{"class":1080},[1059,3081,3082],{"class":1199}," id",[1059,3084,1104],{"class":1080},[1059,3086,3087],{"class":1112},"product_id",[1059,3089,1238],{"class":1080},[1059,3091,3093,3096,3098],{"class":1061,"line":3092},35,[1059,3094,3095],{"class":1100},"    data ",[1059,3097,1104],{"class":1080},[1059,3099,3100],{"class":1080}," {\n",[1059,3102,3104,3106,3109,3111,3113,3116,3118,3120],{"class":1061,"line":3103},36,[1059,3105,1793],{"class":1164},[1059,3107,3108],{"class":1168},"name",[1059,3110,1165],{"class":1164},[1059,3112,2934],{"class":1080},[1059,3114,3115],{"class":1100}," product",[1059,3117,1088],{"class":1080},[1059,3119,3108],{"class":1157},[1059,3121,1819],{"class":1080},[1059,3123,3125,3127,3129,3131,3133,3136,3138,3140,3142,3144],{"class":1061,"line":3124},37,[1059,3126,1793],{"class":1164},[1059,3128,2747],{"class":1168},[1059,3130,1165],{"class":1164},[1059,3132,2934],{"class":1080},[1059,3134,3135],{"class":2782}," str",[1059,3137,1081],{"class":1080},[1059,3139,3027],{"class":1112},[1059,3141,1088],{"class":1080},[1059,3143,2747],{"class":1157},[1059,3145,1647],{"class":1080},[1059,3147,3149,3151,3153,3155,3157,3159,3161],{"class":1061,"line":3148},38,[1059,3150,1793],{"class":1164},[1059,3152,2908],{"class":1168},[1059,3154,1165],{"class":1164},[1059,3156,2934],{"class":1080},[1059,3158,3115],{"class":1100},[1059,3160,1088],{"class":1080},[1059,3162,3163],{"class":1157},"in_stock\n",[1059,3165,3167],{"class":1061,"line":3166},39,[1059,3168,3169],{"class":1080},"    }\n",[1059,3171,3173,3175,3178,3180,3183],{"class":1061,"line":3172},40,[1059,3174,2945],{"class":1180},[1059,3176,3177],{"class":1112}," JsonResponse",[1059,3179,1081],{"class":1080},[1059,3181,3182],{"class":1112},"data",[1059,3184,1238],{"class":1080},[1059,3186,3188],{"class":1061,"line":3187},41,[1059,3189,1254],{"emptyLinePlaceholder":1253},[1059,3191,3193],{"class":1061,"line":3192},42,[1059,3194,3195],{"class":1065},"# TEMPLATE: Presentation layer\n",[1059,3197,3199],{"class":1061,"line":3198},43,[1059,3200,3201],{"class":1065},"# products/list.html\n",[1059,3203,3205,3207,3209,3211,3213,3215,3217,3219],{"class":1061,"line":3204},44,[1059,3206,1860],{"class":1080},[1059,3208,1864],{"class":1863},[1059,3210,1867],{"class":1100},[1059,3212,1165],{"class":1164},[1059,3214,1872],{"class":1168},[1059,3216,1165],{"class":1164},[1059,3218,1877],{"class":1863},[1059,3220,2940],{"class":1080},[1059,3222,3224],{"class":1061,"line":3223},45,[1059,3225,1254],{"emptyLinePlaceholder":1253},[1059,3227,3229,3231,3233,3236,3238],{"class":1061,"line":3228},46,[1059,3230,1860],{"class":1080},[1059,3232,1864],{"class":1863},[1059,3234,3235],{"class":1100}," block content ",[1059,3237,1864],{"class":1863},[1059,3239,2940],{"class":1080},[1059,3241,3243,3246,3248,3251,3254,3257,3259],{"class":1061,"line":3242},47,[1059,3244,3245],{"class":1863},"    \u003C",[1059,3247,1022],{"class":1100},[1059,3249,3250],{"class":1863},">",[1059,3252,3253],{"class":1100},"Products",[1059,3255,3256],{"class":1863},"\u003C/",[1059,3258,1022],{"class":1100},[1059,3260,3261],{"class":1863},">\n",[1059,3263,3265,3268,3270,3273,3276,3279,3282,3284],{"class":1061,"line":3264},48,[1059,3266,3267],{"class":1080},"    {",[1059,3269,1864],{"class":1863},[1059,3271,3272],{"class":1180}," for",[1059,3274,3275],{"class":1100}," product ",[1059,3277,3278],{"class":1180},"in",[1059,3280,3281],{"class":1100}," products ",[1059,3283,1864],{"class":1863},[1059,3285,2940],{"class":1080},[1059,3287,3289,3292,3295,3297,3299,3301,3304,3306],{"class":1061,"line":3288},49,[1059,3290,3291],{"class":1863},"        \u003C",[1059,3293,3294],{"class":1100},"div ",[1059,3296,1073],{"class":1072},[1059,3298,1104],{"class":1080},[1059,3300,1230],{"class":1164},[1059,3302,3303],{"class":1168},"product-card",[1059,3305,1230],{"class":1164},[1059,3307,3261],{"class":1863},[1059,3309,3311,3314,3316,3318,3321,3323,3325,3327,3330,3332,3334],{"class":1061,"line":3310},50,[1059,3312,3313],{"class":1863},"            \u003C",[1059,3315,1035],{"class":1100},[1059,3317,3250],{"class":1863},[1059,3319,3320],{"class":1080},"{{",[1059,3322,3115],{"class":1100},[1059,3324,1088],{"class":1080},[1059,3326,3108],{"class":1157},[1059,3328,3329],{"class":1080}," }}",[1059,3331,3256],{"class":1863},[1059,3333,1035],{"class":1100},[1059,3335,3261],{"class":1863},[1059,3337,3339,3341,3343,3345,3349,3351,3353,3355,3357,3359,3361,3363],{"class":1061,"line":3338},51,[1059,3340,3313],{"class":1863},[1059,3342,1026],{"class":1100},[1059,3344,3250],{"class":1863},[1059,3346,3348],{"class":3347},"srjyR","$",[1059,3350,3320],{"class":1080},[1059,3352,3115],{"class":1100},[1059,3354,1088],{"class":1080},[1059,3356,2747],{"class":1157},[1059,3358,3329],{"class":1080},[1059,3360,3256],{"class":1863},[1059,3362,1026],{"class":1100},[1059,3364,3261],{"class":1863},[1059,3366,3368,3371,3373,3376,3378,3380,3383,3385],{"class":1061,"line":3367},52,[1059,3369,3370],{"class":1080},"            {",[1059,3372,1864],{"class":1863},[1059,3374,3375],{"class":1180}," if",[1059,3377,3115],{"class":1100},[1059,3379,1088],{"class":1080},[1059,3381,3382],{"class":1157},"is_expensive",[1059,3384,1877],{"class":1863},[1059,3386,2940],{"class":1080},[1059,3388,3390,3393,3396,3398,3400,3402,3405,3407,3409,3412,3414,3416],{"class":1061,"line":3389},53,[1059,3391,3392],{"class":1863},"                \u003C",[1059,3394,3395],{"class":1100},"span ",[1059,3397,1073],{"class":1072},[1059,3399,1104],{"class":1080},[1059,3401,1230],{"class":1164},[1059,3403,3404],{"class":1168},"badge",[1059,3406,1230],{"class":1164},[1059,3408,3250],{"class":1863},[1059,3410,3411],{"class":1100},"Premium",[1059,3413,3256],{"class":1863},[1059,3415,1059],{"class":1100},[1059,3417,3261],{"class":1863},[1059,3419,3421,3423,3425,3428,3430],{"class":1061,"line":3420},54,[1059,3422,3370],{"class":1080},[1059,3424,1864],{"class":1863},[1059,3426,3427],{"class":1100}," endif ",[1059,3429,1864],{"class":1863},[1059,3431,2940],{"class":1080},[1059,3433,3435,3438,3441],{"class":1061,"line":3434},55,[1059,3436,3437],{"class":1863},"        \u003C/",[1059,3439,3440],{"class":1100},"div",[1059,3442,3261],{"class":1863},[1059,3444,3446,3448,3450,3453,3455],{"class":1061,"line":3445},56,[1059,3447,3267],{"class":1080},[1059,3449,1864],{"class":1863},[1059,3451,3452],{"class":1100}," endfor ",[1059,3454,1864],{"class":1863},[1059,3456,2940],{"class":1080},[1059,3458,3460,3462,3464,3467,3469],{"class":1061,"line":3459},57,[1059,3461,1860],{"class":1080},[1059,3463,1864],{"class":1863},[1059,3465,3466],{"class":1100}," endblock ",[1059,3468,1864],{"class":1863},[1059,3470,2940],{"class":1080},[1030,3472,3474],{"id":3473},"the-request-response-cycle","The Request-Response Cycle",[1026,3476,3477],{},"Understanding Django's request-response cycle is crucial for effective development:",[1049,3479,3481],{"className":1051,"code":3480,"language":1053,"meta":1054,"style":1054},"# 1. URL RESOLUTION\n# urls.py\nurlpatterns = [\n    path('products/\u003Cint:pk>/', views.ProductDetailView.as_view(), name='product_detail'),\n]\n\n# 2. MIDDLEWARE PROCESSING (Request Phase)\nclass CustomMiddleware:\n    def __init__(self, get_response):\n        self.get_response = get_response\n\n    def __call__(self, request):\n        # Process request before view\n        request.custom_data = \"processed\"\n        \n        response = self.get_response(request)\n        \n        # Process response after view\n        response['X-Custom-Header'] = 'Django'\n        return response\n\n# 3. VIEW PROCESSING\nclass ProductDetailView(DetailView):\n    model = Product\n    \n    def get_context_data(self, **kwargs):\n        context = super().get_context_data(**kwargs)\n        context['related_products'] = Product.objects.filter(\n            category=self.object.category\n        ).exclude(pk=self.object.pk)[:3]\n        return context\n\n# 4. TEMPLATE RENDERING\n# The template system processes the template with context data\n\n# 5. RESPONSE GENERATION\n# Django creates an HttpResponse object\n\n# 6. MIDDLEWARE PROCESSING (Response Phase)\n# Middleware processes the response in reverse order\n",[1056,3482,3483,3488,3493,3501,3545,3549,3553,3558,3567,3584,3598,3602,3620,3625,3646,3651,3670,3674,3679,3705,3712,3716,3721,3733,3741,3745,3764,3789,3819,3838,3871,3878,3882,3887,3892,3896,3901,3906,3910,3915],{"__ignoreMap":1054},[1059,3484,3485],{"class":1061,"line":1062},[1059,3486,3487],{"class":1065},"# 1. URL RESOLUTION\n",[1059,3489,3490],{"class":1061,"line":1069},[1059,3491,3492],{"class":1065},"# urls.py\n",[1059,3494,3495,3497,3499],{"class":1061,"line":1097},[1059,3496,1615],{"class":1100},[1059,3498,1104],{"class":1080},[1059,3500,1620],{"class":1080},[1059,3502,3503,3505,3507,3509,3512,3514,3516,3518,3520,3523,3525,3528,3531,3534,3536,3538,3541,3543],{"class":1061,"line":1119},[1059,3504,1625],{"class":1112},[1059,3506,1081],{"class":1080},[1059,3508,1165],{"class":1164},[1059,3510,3511],{"class":1168},"products/\u003Cint:pk>/",[1059,3513,1165],{"class":1164},[1059,3515,1524],{"class":1080},[1059,3517,1639],{"class":1112},[1059,3519,1088],{"class":1080},[1059,3521,3522],{"class":1157},"ProductDetailView",[1059,3524,1088],{"class":1080},[1059,3526,3527],{"class":1112},"as_view",[1059,3529,3530],{"class":1080},"(),",[1059,3532,3533],{"class":1199}," name",[1059,3535,1104],{"class":1080},[1059,3537,1165],{"class":1164},[1059,3539,3540],{"class":1168},"product_detail",[1059,3542,1165],{"class":1164},[1059,3544,1647],{"class":1080},[1059,3546,3547],{"class":1061,"line":1125},[1059,3548,1174],{"class":1080},[1059,3550,3551],{"class":1061,"line":1143},[1059,3552,1254],{"emptyLinePlaceholder":1253},[1059,3554,3555],{"class":1061,"line":1177},[1059,3556,3557],{"class":1065},"# 2. MIDDLEWARE PROCESSING (Request Phase)\n",[1059,3559,3560,3562,3565],{"class":1061,"line":1215},[1059,3561,1073],{"class":1072},[1059,3563,3564],{"class":1076}," CustomMiddleware",[1059,3566,1411],{"class":1080},[1059,3568,3569,3571,3573,3575,3577,3579,3582],{"class":1061,"line":1241},[1059,3570,1128],{"class":1072},[1059,3572,2183],{"class":2182},[1059,3574,1081],{"class":1080},[1059,3576,1138],{"class":1137},[1059,3578,1524],{"class":1080},[1059,3580,3581],{"class":2013}," get_response",[1059,3583,1094],{"class":1080},[1059,3585,3586,3588,3590,3593,3595],{"class":1061,"line":1250},[1059,3587,2199],{"class":1151},[1059,3589,1088],{"class":1080},[1059,3591,3592],{"class":1157},"get_response",[1059,3594,2207],{"class":1080},[1059,3596,3597],{"class":1100}," get_response\n",[1059,3599,3600],{"class":1061,"line":1257},[1059,3601,1254],{"emptyLinePlaceholder":1253},[1059,3603,3604,3606,3609,3611,3613,3615,3618],{"class":1061,"line":1275},[1059,3605,1128],{"class":1072},[1059,3607,3608],{"class":2182}," __call__",[1059,3610,1081],{"class":1080},[1059,3612,1138],{"class":1137},[1059,3614,1524],{"class":1080},[1059,3616,3617],{"class":2013}," request",[1059,3619,1094],{"class":1080},[1059,3621,3622],{"class":1061,"line":1290},[1059,3623,3624],{"class":1065},"        # Process request before view\n",[1059,3626,3627,3630,3632,3635,3637,3640,3643],{"class":1061,"line":1295},[1059,3628,3629],{"class":1100},"        request",[1059,3631,1088],{"class":1080},[1059,3633,3634],{"class":1157},"custom_data",[1059,3636,2207],{"class":1080},[1059,3638,3639],{"class":1164}," \"",[1059,3641,3642],{"class":1168},"processed",[1059,3644,3645],{"class":1164},"\"\n",[1059,3647,3648],{"class":1061,"line":1308},[1059,3649,3650],{"class":1100},"        \n",[1059,3652,3653,3656,3658,3660,3662,3664,3666,3668],{"class":1061,"line":1331},[1059,3654,3655],{"class":1100},"        response ",[1059,3657,1104],{"class":1080},[1059,3659,1152],{"class":1151},[1059,3661,1088],{"class":1080},[1059,3663,3592],{"class":1112},[1059,3665,1081],{"class":1080},[1059,3667,2874],{"class":1112},[1059,3669,1238],{"class":1080},[1059,3671,3672],{"class":1061,"line":1364},[1059,3673,3650],{"class":1100},[1059,3675,3676],{"class":1061,"line":1385},[1059,3677,3678],{"class":1065},"        # Process response after view\n",[1059,3680,3681,3684,3686,3688,3691,3693,3696,3698,3700,3703],{"class":1061,"line":1392},[1059,3682,3683],{"class":1100},"        response",[1059,3685,1161],{"class":1080},[1059,3687,1165],{"class":1164},[1059,3689,3690],{"class":1168},"X-Custom-Header",[1059,3692,1165],{"class":1164},[1059,3694,3695],{"class":1080},"]",[1059,3697,2207],{"class":1080},[1059,3699,2533],{"class":1164},[1059,3701,3702],{"class":1168},"Django",[1059,3704,2539],{"class":1164},[1059,3706,3707,3709],{"class":1061,"line":1397},[1059,3708,1244],{"class":1180},[1059,3710,3711],{"class":1100}," response\n",[1059,3713,3714],{"class":1061,"line":1403},[1059,3715,1254],{"emptyLinePlaceholder":1253},[1059,3717,3718],{"class":1061,"line":1414},[1059,3719,3720],{"class":1065},"# 3. VIEW PROCESSING\n",[1059,3722,3723,3725,3727,3729,3731],{"class":1061,"line":1427},[1059,3724,1073],{"class":1072},[1059,3726,2978],{"class":1076},[1059,3728,1081],{"class":1080},[1059,3730,2983],{"class":1084},[1059,3732,1094],{"class":1080},[1059,3734,3735,3737,3739],{"class":1061,"line":1450},[1059,3736,2518],{"class":1100},[1059,3738,1104],{"class":1080},[1059,3740,3003],{"class":1100},[1059,3742,3743],{"class":1061,"line":1479},[1059,3744,1122],{"class":1100},[1059,3746,3747,3749,3752,3754,3756,3758,3760,3762],{"class":1061,"line":1500},[1059,3748,1128],{"class":1072},[1059,3750,3751],{"class":1131}," get_context_data",[1059,3753,1081],{"class":1080},[1059,3755,1138],{"class":1137},[1059,3757,1524],{"class":1080},[1059,3759,2029],{"class":1863},[1059,3761,2032],{"class":2013},[1059,3763,1094],{"class":1080},[1059,3765,3766,3769,3771,3774,3777,3780,3782,3785,3787],{"class":1061,"line":1507},[1059,3767,3768],{"class":1100},"        context ",[1059,3770,1104],{"class":1080},[1059,3772,3773],{"class":2782}," super",[1059,3775,3776],{"class":1080},"().",[1059,3778,3779],{"class":1112},"get_context_data",[1059,3781,1081],{"class":1080},[1059,3783,3784],{"class":1863},"**",[1059,3786,2032],{"class":1112},[1059,3788,1238],{"class":1080},[1059,3790,3791,3794,3796,3798,3801,3803,3805,3807,3809,3811,3813,3815,3817],{"class":1061,"line":1512},[1059,3792,3793],{"class":1100},"        context",[1059,3795,1161],{"class":1080},[1059,3797,1165],{"class":1164},[1059,3799,3800],{"class":1168},"related_products",[1059,3802,1165],{"class":1164},[1059,3804,3695],{"class":1080},[1059,3806,2207],{"class":1080},[1059,3808,2591],{"class":1100},[1059,3810,1088],{"class":1080},[1059,3812,1189],{"class":1157},[1059,3814,1088],{"class":1080},[1059,3816,1194],{"class":1112},[1059,3818,1721],{"class":1080},[1059,3820,3821,3824,3826,3828,3830,3833,3835],{"class":1061,"line":1535},[1059,3822,3823],{"class":1199},"            category",[1059,3825,1104],{"class":1080},[1059,3827,1138],{"class":1151},[1059,3829,1088],{"class":1080},[1059,3831,3832],{"class":1157},"object",[1059,3834,1088],{"class":1080},[1059,3836,3837],{"class":1157},"category\n",[1059,3839,3840,3843,3846,3848,3851,3853,3855,3857,3859,3861,3863,3866,3869],{"class":1061,"line":1550},[1059,3841,3842],{"class":1080},"        ).",[1059,3844,3845],{"class":1112},"exclude",[1059,3847,1081],{"class":1080},[1059,3849,3850],{"class":1199},"pk",[1059,3852,1104],{"class":1080},[1059,3854,1138],{"class":1151},[1059,3856,1088],{"class":1080},[1059,3858,3832],{"class":1157},[1059,3860,1088],{"class":1080},[1059,3862,3850],{"class":1157},[1059,3864,3865],{"class":1080},")[:",[1059,3867,3868],{"class":2323},"3",[1059,3870,1174],{"class":1080},[1059,3872,3873,3875],{"class":1061,"line":1555},[1059,3874,1244],{"class":1180},[1059,3876,3877],{"class":1100}," context\n",[1059,3879,3880],{"class":1061,"line":1576},[1059,3881,1254],{"emptyLinePlaceholder":1253},[1059,3883,3884],{"class":1061,"line":3054},[1059,3885,3886],{"class":1065},"# 4. TEMPLATE RENDERING\n",[1059,3888,3889],{"class":1061,"line":3064},[1059,3890,3891],{"class":1065},"# The template system processes the template with context data\n",[1059,3893,3894],{"class":1061,"line":3092},[1059,3895,1254],{"emptyLinePlaceholder":1253},[1059,3897,3898],{"class":1061,"line":3103},[1059,3899,3900],{"class":1065},"# 5. RESPONSE GENERATION\n",[1059,3902,3903],{"class":1061,"line":3124},[1059,3904,3905],{"class":1065},"# Django creates an HttpResponse object\n",[1059,3907,3908],{"class":1061,"line":3148},[1059,3909,1254],{"emptyLinePlaceholder":1253},[1059,3911,3912],{"class":1061,"line":3166},[1059,3913,3914],{"class":1065},"# 6. MIDDLEWARE PROCESSING (Response Phase)\n",[1059,3916,3917],{"class":1061,"line":3172},[1059,3918,3919],{"class":1065},"# Middleware processes the response in reverse order\n",[1035,3921,3923],{"id":3922},"detailed-request-flow","Detailed Request Flow",[1049,3925,3929],{"className":3926,"code":3927,"language":3928,"meta":1054,"style":1054},"language-mermaid shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","graph TD\n    A[Browser Request] --> B[Django Server]\n    B --> C[URL Resolver]\n    C --> D[Middleware Stack]\n    D --> E[View Function/Class]\n    E --> F[Model Layer]\n    F --> G[Database]\n    G --> F\n    F --> E\n    E --> H[Template Engine]\n    H --> I[Rendered HTML]\n    I --> D\n    D --> J[HTTP Response]\n    J --> A\n","mermaid",[1056,3930,3931,3936,3941,3946,3951,3956,3961,3966,3971,3976,3981,3986,3991,3996],{"__ignoreMap":1054},[1059,3932,3933],{"class":1061,"line":1062},[1059,3934,3935],{},"graph TD\n",[1059,3937,3938],{"class":1061,"line":1069},[1059,3939,3940],{},"    A[Browser Request] --> B[Django Server]\n",[1059,3942,3943],{"class":1061,"line":1097},[1059,3944,3945],{},"    B --> C[URL Resolver]\n",[1059,3947,3948],{"class":1061,"line":1119},[1059,3949,3950],{},"    C --> D[Middleware Stack]\n",[1059,3952,3953],{"class":1061,"line":1125},[1059,3954,3955],{},"    D --> E[View Function/Class]\n",[1059,3957,3958],{"class":1061,"line":1143},[1059,3959,3960],{},"    E --> F[Model Layer]\n",[1059,3962,3963],{"class":1061,"line":1177},[1059,3964,3965],{},"    F --> G[Database]\n",[1059,3967,3968],{"class":1061,"line":1215},[1059,3969,3970],{},"    G --> F\n",[1059,3972,3973],{"class":1061,"line":1241},[1059,3974,3975],{},"    F --> E\n",[1059,3977,3978],{"class":1061,"line":1250},[1059,3979,3980],{},"    E --> H[Template Engine]\n",[1059,3982,3983],{"class":1061,"line":1257},[1059,3984,3985],{},"    H --> I[Rendered HTML]\n",[1059,3987,3988],{"class":1061,"line":1275},[1059,3989,3990],{},"    I --> D\n",[1059,3992,3993],{"class":1061,"line":1290},[1059,3994,3995],{},"    D --> J[HTTP Response]\n",[1059,3997,3998],{"class":1061,"line":1295},[1059,3999,4000],{},"    J --> A\n",[1030,4002,4004],{"id":4003},"core-components-deep-dive","Core Components Deep Dive",[1035,4006,4008],{"id":4007},"_1-models-the-data-layer","1. Models: The Data Layer",[1026,4010,4011],{},"Models define your data structure and encapsulate business logic:",[1049,4013,4015],{"className":1051,"code":4014,"language":1053,"meta":1054,"style":1054},"from django.db import models\nfrom django.contrib.auth.models import User\nfrom django.urls import reverse\n\nclass Category(models.Model):\n    name = models.CharField(max_length=100, unique=True)\n    slug = models.SlugField(unique=True)\n    description = models.TextField(blank=True)\n    \n    class Meta:\n        verbose_name_plural = \"categories\"\n        ordering = ['name']\n    \n    def __str__(self):\n        return self.name\n    \n    def get_absolute_url(self):\n        return reverse('category_detail', kwargs={'slug': self.slug})\n\nclass Product(models.Model):\n    CONDITION_CHOICES = [\n        ('new', 'New'),\n        ('used', 'Used'),\n        ('refurbished', 'Refurbished'),\n    ]\n    \n    name = models.CharField(max_length=200)\n    slug = models.SlugField(unique=True)\n    category = models.ForeignKey(Category, on_delete=models.CASCADE)\n    price = models.DecimalField(max_digits=10, decimal_places=2)\n    condition = models.CharField(max_length=20, choices=CONDITION_CHOICES)\n    description = models.TextField()\n    image = models.ImageField(upload_to='products/', blank=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n    updated_at = models.DateTimeField(auto_now=True)\n    \n    class Meta:\n        ordering = ['-created_at']\n        indexes = [\n            models.Index(fields=['category', 'price']),\n            models.Index(fields=['created_at']),\n        ]\n    \n    def __str__(self):\n        return self.name\n    \n    def get_absolute_url(self):\n        return reverse('product_detail', kwargs={'slug': self.slug})\n    \n    @property\n    def is_new(self):\n        return self.condition == 'new'\n",[1056,4016,4017,4033,4059,4075,4079,4096,4127,4152,4175,4179,4187,4201,4217,4221,4233,4244,4248,4261,4303,4307,4323,4332,4355,4377,4399,4404,4408,4430,4452,4482,4512,4547,4561,4600,4622,4646,4650,4658,4674,4683,4719,4742,4747,4751,4763,4773,4777,4789,4825,4829,4835,4848],{"__ignoreMap":1054},[1059,4018,4019,4021,4023,4025,4028,4030],{"class":1061,"line":1062},[1059,4020,1932],{"class":1180},[1059,4022,1935],{"class":1100},[1059,4024,1088],{"class":1080},[1059,4026,4027],{"class":1100},"db ",[1059,4029,1952],{"class":1180},[1059,4031,4032],{"class":1100}," models\n",[1059,4034,4035,4037,4039,4041,4044,4046,4049,4051,4054,4056],{"class":1061,"line":1069},[1059,4036,1932],{"class":1180},[1059,4038,1935],{"class":1100},[1059,4040,1088],{"class":1080},[1059,4042,4043],{"class":1100},"contrib",[1059,4045,1088],{"class":1080},[1059,4047,4048],{"class":1100},"auth",[1059,4050,1088],{"class":1080},[1059,4052,4053],{"class":1100},"models ",[1059,4055,1952],{"class":1180},[1059,4057,4058],{"class":1100}," User\n",[1059,4060,4061,4063,4065,4067,4070,4072],{"class":1061,"line":1097},[1059,4062,1932],{"class":1180},[1059,4064,1935],{"class":1100},[1059,4066,1088],{"class":1080},[1059,4068,4069],{"class":1100},"urls ",[1059,4071,1952],{"class":1180},[1059,4073,4074],{"class":1100}," reverse\n",[1059,4076,4077],{"class":1061,"line":1119},[1059,4078,1254],{"emptyLinePlaceholder":1253},[1059,4080,4081,4083,4086,4088,4090,4092,4094],{"class":1061,"line":1125},[1059,4082,1073],{"class":1072},[1059,4084,4085],{"class":1076}," Category",[1059,4087,1081],{"class":1080},[1059,4089,1696],{"class":1084},[1059,4091,1088],{"class":1080},[1059,4093,1701],{"class":1084},[1059,4095,1094],{"class":1080},[1059,4097,4098,4100,4102,4104,4106,4108,4110,4112,4114,4116,4118,4121,4123,4125],{"class":1061,"line":1143},[1059,4099,2606],{"class":1100},[1059,4101,1104],{"class":1080},[1059,4103,1713],{"class":1100},[1059,4105,1088],{"class":1080},[1059,4107,2313],{"class":1112},[1059,4109,1081],{"class":1080},[1059,4111,2318],{"class":1199},[1059,4113,1104],{"class":1080},[1059,4115,2623],{"class":2323},[1059,4117,1524],{"class":1080},[1059,4119,4120],{"class":1199}," unique",[1059,4122,1104],{"class":1080},[1059,4124,1830],{"class":1829},[1059,4126,1238],{"class":1080},[1059,4128,4129,4132,4134,4136,4138,4141,4143,4146,4148,4150],{"class":1061,"line":1177},[1059,4130,4131],{"class":1100},"    slug ",[1059,4133,1104],{"class":1080},[1059,4135,1713],{"class":1100},[1059,4137,1088],{"class":1080},[1059,4139,4140],{"class":1112},"SlugField",[1059,4142,1081],{"class":1080},[1059,4144,4145],{"class":1199},"unique",[1059,4147,1104],{"class":1080},[1059,4149,1830],{"class":1829},[1059,4151,1238],{"class":1080},[1059,4153,4154,4156,4158,4160,4162,4164,4166,4169,4171,4173],{"class":1061,"line":1215},[1059,4155,2666],{"class":1100},[1059,4157,1104],{"class":1080},[1059,4159,1713],{"class":1100},[1059,4161,1088],{"class":1080},[1059,4163,2340],{"class":1112},[1059,4165,1081],{"class":1080},[1059,4167,4168],{"class":1199},"blank",[1059,4170,1104],{"class":1080},[1059,4172,1830],{"class":1829},[1059,4174,1238],{"class":1080},[1059,4176,4177],{"class":1061,"line":1241},[1059,4178,1122],{"class":1100},[1059,4180,4181,4183,4185],{"class":1061,"line":1250},[1059,4182,2435],{"class":1072},[1059,4184,2438],{"class":1076},[1059,4186,1411],{"class":1080},[1059,4188,4189,4192,4194,4196,4199],{"class":1061,"line":1257},[1059,4190,4191],{"class":1100},"        verbose_name_plural ",[1059,4193,1104],{"class":1080},[1059,4195,3639],{"class":1164},[1059,4197,4198],{"class":1168},"categories",[1059,4200,3645],{"class":1164},[1059,4202,4203,4205,4207,4209,4211,4213,4215],{"class":1061,"line":1275},[1059,4204,2445],{"class":1100},[1059,4206,1104],{"class":1080},[1059,4208,2450],{"class":1080},[1059,4210,1165],{"class":1164},[1059,4212,3108],{"class":1168},[1059,4214,1165],{"class":1164},[1059,4216,1174],{"class":1080},[1059,4218,4219],{"class":1061,"line":1290},[1059,4220,1122],{"class":1100},[1059,4222,4223,4225,4227,4229,4231],{"class":1061,"line":1295},[1059,4224,1128],{"class":1072},[1059,4226,2409],{"class":2182},[1059,4228,1081],{"class":1080},[1059,4230,1138],{"class":1137},[1059,4232,1094],{"class":1080},[1059,4234,4235,4237,4239,4241],{"class":1061,"line":1308},[1059,4236,1244],{"class":1180},[1059,4238,1152],{"class":1151},[1059,4240,1088],{"class":1080},[1059,4242,4243],{"class":1157},"name\n",[1059,4245,4246],{"class":1061,"line":1331},[1059,4247,1122],{"class":1100},[1059,4249,4250,4252,4255,4257,4259],{"class":1061,"line":1364},[1059,4251,1128],{"class":1072},[1059,4253,4254],{"class":1131}," get_absolute_url",[1059,4256,1081],{"class":1080},[1059,4258,1138],{"class":1137},[1059,4260,1094],{"class":1080},[1059,4262,4263,4265,4268,4270,4272,4275,4277,4279,4282,4285,4287,4290,4292,4294,4296,4298,4300],{"class":1061,"line":1385},[1059,4264,1244],{"class":1180},[1059,4266,4267],{"class":1112}," reverse",[1059,4269,1081],{"class":1080},[1059,4271,1165],{"class":1164},[1059,4273,4274],{"class":1168},"category_detail",[1059,4276,1165],{"class":1164},[1059,4278,1524],{"class":1080},[1059,4280,4281],{"class":1199}," kwargs",[1059,4283,4284],{"class":1080},"={",[1059,4286,1165],{"class":1164},[1059,4288,4289],{"class":1168},"slug",[1059,4291,1165],{"class":1164},[1059,4293,2934],{"class":1080},[1059,4295,1152],{"class":1151},[1059,4297,1088],{"class":1080},[1059,4299,4289],{"class":1157},[1059,4301,4302],{"class":1080},"})\n",[1059,4304,4305],{"class":1061,"line":1392},[1059,4306,1254],{"emptyLinePlaceholder":1253},[1059,4308,4309,4311,4313,4315,4317,4319,4321],{"class":1061,"line":1397},[1059,4310,1073],{"class":1072},[1059,4312,2591],{"class":1076},[1059,4314,1081],{"class":1080},[1059,4316,1696],{"class":1084},[1059,4318,1088],{"class":1080},[1059,4320,1701],{"class":1084},[1059,4322,1094],{"class":1080},[1059,4324,4325,4328,4330],{"class":1061,"line":1403},[1059,4326,4327],{"class":1151},"    CONDITION_CHOICES",[1059,4329,2207],{"class":1080},[1059,4331,1620],{"class":1080},[1059,4333,4334,4337,4339,4342,4344,4346,4348,4351,4353],{"class":1061,"line":1414},[1059,4335,4336],{"class":1080},"        (",[1059,4338,1165],{"class":1164},[1059,4340,4341],{"class":1168},"new",[1059,4343,1165],{"class":1164},[1059,4345,1524],{"class":1080},[1059,4347,2533],{"class":1164},[1059,4349,4350],{"class":1168},"New",[1059,4352,1165],{"class":1164},[1059,4354,1647],{"class":1080},[1059,4356,4357,4359,4361,4364,4366,4368,4370,4373,4375],{"class":1061,"line":1427},[1059,4358,4336],{"class":1080},[1059,4360,1165],{"class":1164},[1059,4362,4363],{"class":1168},"used",[1059,4365,1165],{"class":1164},[1059,4367,1524],{"class":1080},[1059,4369,2533],{"class":1164},[1059,4371,4372],{"class":1168},"Used",[1059,4374,1165],{"class":1164},[1059,4376,1647],{"class":1080},[1059,4378,4379,4381,4383,4386,4388,4390,4392,4395,4397],{"class":1061,"line":1450},[1059,4380,4336],{"class":1080},[1059,4382,1165],{"class":1164},[1059,4384,4385],{"class":1168},"refurbished",[1059,4387,1165],{"class":1164},[1059,4389,1524],{"class":1080},[1059,4391,2533],{"class":1164},[1059,4393,4394],{"class":1168},"Refurbished",[1059,4396,1165],{"class":1164},[1059,4398,1647],{"class":1080},[1059,4400,4401],{"class":1061,"line":1479},[1059,4402,4403],{"class":1080},"    ]\n",[1059,4405,4406],{"class":1061,"line":1500},[1059,4407,1122],{"class":1100},[1059,4409,4410,4412,4414,4416,4418,4420,4422,4424,4426,4428],{"class":1061,"line":1507},[1059,4411,2606],{"class":1100},[1059,4413,1104],{"class":1080},[1059,4415,1713],{"class":1100},[1059,4417,1088],{"class":1080},[1059,4419,2313],{"class":1112},[1059,4421,1081],{"class":1080},[1059,4423,2318],{"class":1199},[1059,4425,1104],{"class":1080},[1059,4427,2324],{"class":2323},[1059,4429,1238],{"class":1080},[1059,4431,4432,4434,4436,4438,4440,4442,4444,4446,4448,4450],{"class":1061,"line":1512},[1059,4433,4131],{"class":1100},[1059,4435,1104],{"class":1080},[1059,4437,1713],{"class":1100},[1059,4439,1088],{"class":1080},[1059,4441,4140],{"class":1112},[1059,4443,1081],{"class":1080},[1059,4445,4145],{"class":1199},[1059,4447,1104],{"class":1080},[1059,4449,1830],{"class":1829},[1059,4451,1238],{"class":1080},[1059,4453,4454,4456,4458,4460,4462,4464,4466,4468,4470,4472,4474,4476,4478,4480],{"class":1061,"line":1535},[1059,4455,1778],{"class":1100},[1059,4457,1104],{"class":1080},[1059,4459,1713],{"class":1100},[1059,4461,1088],{"class":1080},[1059,4463,1718],{"class":1112},[1059,4465,1081],{"class":1080},[1059,4467,1796],{"class":1112},[1059,4469,1524],{"class":1080},[1059,4471,2363],{"class":1199},[1059,4473,1104],{"class":1080},[1059,4475,1696],{"class":1112},[1059,4477,1088],{"class":1080},[1059,4479,1746],{"class":1745},[1059,4481,1238],{"class":1080},[1059,4483,4484,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510],{"class":1061,"line":1550},[1059,4485,2630],{"class":1100},[1059,4487,1104],{"class":1080},[1059,4489,1713],{"class":1100},[1059,4491,1088],{"class":1080},[1059,4493,2639],{"class":1112},[1059,4495,1081],{"class":1080},[1059,4497,2644],{"class":1199},[1059,4499,1104],{"class":1080},[1059,4501,2649],{"class":2323},[1059,4503,1524],{"class":1080},[1059,4505,2654],{"class":1199},[1059,4507,1104],{"class":1080},[1059,4509,2659],{"class":2323},[1059,4511,1238],{"class":1080},[1059,4513,4514,4517,4519,4521,4523,4525,4527,4529,4531,4534,4536,4539,4541,4545],{"class":1061,"line":1555},[1059,4515,4516],{"class":1100},"    condition ",[1059,4518,1104],{"class":1080},[1059,4520,1713],{"class":1100},[1059,4522,1088],{"class":1080},[1059,4524,2313],{"class":1112},[1059,4526,1081],{"class":1080},[1059,4528,2318],{"class":1199},[1059,4530,1104],{"class":1080},[1059,4532,4533],{"class":2323},"20",[1059,4535,1524],{"class":1080},[1059,4537,4538],{"class":1199}," choices",[1059,4540,1104],{"class":1080},[1059,4542,4544],{"class":4543},"s6DHA","CONDITION_CHOICES",[1059,4546,1238],{"class":1080},[1059,4548,4549,4551,4553,4555,4557,4559],{"class":1061,"line":1576},[1059,4550,2666],{"class":1100},[1059,4552,1104],{"class":1080},[1059,4554,1713],{"class":1100},[1059,4556,1088],{"class":1080},[1059,4558,2340],{"class":1112},[1059,4560,1116],{"class":1080},[1059,4562,4563,4566,4568,4570,4572,4575,4577,4580,4582,4584,4587,4589,4591,4594,4596,4598],{"class":1061,"line":3054},[1059,4564,4565],{"class":1100},"    image ",[1059,4567,1104],{"class":1080},[1059,4569,1713],{"class":1100},[1059,4571,1088],{"class":1080},[1059,4573,4574],{"class":1112},"ImageField",[1059,4576,1081],{"class":1080},[1059,4578,4579],{"class":1199},"upload_to",[1059,4581,1104],{"class":1080},[1059,4583,1165],{"class":1164},[1059,4585,4586],{"class":1168},"products/",[1059,4588,1165],{"class":1164},[1059,4590,1524],{"class":1080},[1059,4592,4593],{"class":1199}," blank",[1059,4595,1104],{"class":1080},[1059,4597,1830],{"class":1829},[1059,4599,1238],{"class":1080},[1059,4601,4602,4604,4606,4608,4610,4612,4614,4616,4618,4620],{"class":1061,"line":3064},[1059,4603,2378],{"class":1100},[1059,4605,1104],{"class":1080},[1059,4607,1713],{"class":1100},[1059,4609,1088],{"class":1080},[1059,4611,2387],{"class":1112},[1059,4613,1081],{"class":1080},[1059,4615,2392],{"class":1199},[1059,4617,1104],{"class":1080},[1059,4619,1830],{"class":1829},[1059,4621,1238],{"class":1080},[1059,4623,4624,4627,4629,4631,4633,4635,4637,4640,4642,4644],{"class":1061,"line":3092},[1059,4625,4626],{"class":1100},"    updated_at ",[1059,4628,1104],{"class":1080},[1059,4630,1713],{"class":1100},[1059,4632,1088],{"class":1080},[1059,4634,2387],{"class":1112},[1059,4636,1081],{"class":1080},[1059,4638,4639],{"class":1199},"auto_now",[1059,4641,1104],{"class":1080},[1059,4643,1830],{"class":1829},[1059,4645,1238],{"class":1080},[1059,4647,4648],{"class":1061,"line":3103},[1059,4649,1122],{"class":1100},[1059,4651,4652,4654,4656],{"class":1061,"line":3124},[1059,4653,2435],{"class":1072},[1059,4655,2438],{"class":1076},[1059,4657,1411],{"class":1080},[1059,4659,4660,4662,4664,4666,4668,4670,4672],{"class":1061,"line":3148},[1059,4661,2445],{"class":1100},[1059,4663,1104],{"class":1080},[1059,4665,2450],{"class":1080},[1059,4667,1165],{"class":1164},[1059,4669,2455],{"class":1168},[1059,4671,1165],{"class":1164},[1059,4673,1174],{"class":1080},[1059,4675,4676,4679,4681],{"class":1061,"line":3166},[1059,4677,4678],{"class":1100},"        indexes ",[1059,4680,1104],{"class":1080},[1059,4682,1620],{"class":1080},[1059,4684,4685,4688,4690,4693,4695,4698,4701,4703,4706,4708,4710,4712,4714,4716],{"class":1061,"line":3172},[1059,4686,4687],{"class":1100},"            models",[1059,4689,1088],{"class":1080},[1059,4691,4692],{"class":1112},"Index",[1059,4694,1081],{"class":1080},[1059,4696,4697],{"class":1199},"fields",[1059,4699,4700],{"class":1080},"=[",[1059,4702,1165],{"class":1164},[1059,4704,4705],{"class":1168},"category",[1059,4707,1165],{"class":1164},[1059,4709,1524],{"class":1080},[1059,4711,2533],{"class":1164},[1059,4713,2747],{"class":1168},[1059,4715,1165],{"class":1164},[1059,4717,4718],{"class":1080},"]),\n",[1059,4720,4721,4723,4725,4727,4729,4731,4733,4735,4738,4740],{"class":1061,"line":3187},[1059,4722,4687],{"class":1100},[1059,4724,1088],{"class":1080},[1059,4726,4692],{"class":1112},[1059,4728,1081],{"class":1080},[1059,4730,4697],{"class":1199},[1059,4732,4700],{"class":1080},[1059,4734,1165],{"class":1164},[1059,4736,4737],{"class":1168},"created_at",[1059,4739,1165],{"class":1164},[1059,4741,4718],{"class":1080},[1059,4743,4744],{"class":1061,"line":3192},[1059,4745,4746],{"class":1080},"        ]\n",[1059,4748,4749],{"class":1061,"line":3198},[1059,4750,1122],{"class":1100},[1059,4752,4753,4755,4757,4759,4761],{"class":1061,"line":3204},[1059,4754,1128],{"class":1072},[1059,4756,2409],{"class":2182},[1059,4758,1081],{"class":1080},[1059,4760,1138],{"class":1137},[1059,4762,1094],{"class":1080},[1059,4764,4765,4767,4769,4771],{"class":1061,"line":3223},[1059,4766,1244],{"class":1180},[1059,4768,1152],{"class":1151},[1059,4770,1088],{"class":1080},[1059,4772,4243],{"class":1157},[1059,4774,4775],{"class":1061,"line":3228},[1059,4776,1122],{"class":1100},[1059,4778,4779,4781,4783,4785,4787],{"class":1061,"line":3242},[1059,4780,1128],{"class":1072},[1059,4782,4254],{"class":1131},[1059,4784,1081],{"class":1080},[1059,4786,1138],{"class":1137},[1059,4788,1094],{"class":1080},[1059,4790,4791,4793,4795,4797,4799,4801,4803,4805,4807,4809,4811,4813,4815,4817,4819,4821,4823],{"class":1061,"line":3264},[1059,4792,1244],{"class":1180},[1059,4794,4267],{"class":1112},[1059,4796,1081],{"class":1080},[1059,4798,1165],{"class":1164},[1059,4800,3540],{"class":1168},[1059,4802,1165],{"class":1164},[1059,4804,1524],{"class":1080},[1059,4806,4281],{"class":1199},[1059,4808,4284],{"class":1080},[1059,4810,1165],{"class":1164},[1059,4812,4289],{"class":1168},[1059,4814,1165],{"class":1164},[1059,4816,2934],{"class":1080},[1059,4818,1152],{"class":1151},[1059,4820,1088],{"class":1080},[1059,4822,4289],{"class":1157},[1059,4824,4302],{"class":1080},[1059,4826,4827],{"class":1061,"line":3288},[1059,4828,1122],{"class":1100},[1059,4830,4831,4833],{"class":1061,"line":3310},[1059,4832,2779],{"class":1080},[1059,4834,2783],{"class":2782},[1059,4836,4837,4839,4842,4844,4846],{"class":1061,"line":3338},[1059,4838,1128],{"class":1072},[1059,4840,4841],{"class":1131}," is_new",[1059,4843,1081],{"class":1080},[1059,4845,1138],{"class":1137},[1059,4847,1094],{"class":1080},[1059,4849,4850,4852,4854,4856,4859,4862,4864,4866],{"class":1061,"line":3367},[1059,4851,1244],{"class":1180},[1059,4853,1152],{"class":1151},[1059,4855,1088],{"class":1080},[1059,4857,4858],{"class":1157},"condition",[1059,4860,4861],{"class":1863}," ==",[1059,4863,2533],{"class":1164},[1059,4865,4341],{"class":1168},[1059,4867,2539],{"class":1164},[1035,4869,4871],{"id":4870},"_2-views-the-logic-layer","2. Views: The Logic Layer",[1026,4873,4874],{},"Views handle request processing and business logic:",[1049,4876,4878],{"className":1051,"code":4877,"language":1053,"meta":1054,"style":1054},"from django.shortcuts import render, get_object_or_404\nfrom django.views.generic import ListView, DetailView, CreateView\nfrom django.contrib.auth.mixins import LoginRequiredMixin\nfrom django.db.models import Q\n\n# Function-based view\ndef product_search(request):\n    query = request.GET.get('q')\n    products = []\n    \n    if query:\n        products = Product.objects.filter(\n            Q(name__icontains=query) | \n            Q(description__icontains=query)\n        ).select_related('category')\n    \n    context = {\n        'products': products,\n        'query': query,\n    }\n    return render(request, 'products/search.html', context)\n\n# Class-based views\nclass ProductListView(ListView):\n    model = Product\n    template_name = 'products/list.html'\n    context_object_name = 'products'\n    paginate_by = 12\n    \n    def get_queryset(self):\n        queryset = Product.objects.select_related('category')\n        category_slug = self.kwargs.get('category_slug')\n        \n        if category_slug:\n            queryset = queryset.filter(category__slug=category_slug)\n        \n        return queryset\n    \n    def get_context_data(self, **kwargs):\n        context = super().get_context_data(**kwargs)\n        context['categories'] = Category.objects.all()\n        return context\n\nclass ProductCreateView(LoginRequiredMixin, CreateView):\n    model = Product\n    fields = ['name', 'category', 'price', 'condition', 'description', 'image']\n    template_name = 'products/create.html'\n    \n    def form_valid(self, form):\n        form.instance.seller = self.request.user\n        return super().form_valid(form)\n",[1056,4879,4880,4898,4929,4953,4972,4976,4981,4994,5024,5033,5037,5046,5065,5088,5103,5120,5124,5132,5146,5160,5164,5189,5193,5198,5211,5219,5231,5243,5252,5256,5269,5296,5324,5328,5337,5362,5366,5373,5377,5395,5415,5444,5450,5454,5473,5481,5540,5553,5557,5575,5602],{"__ignoreMap":1054},[1059,4881,4882,4884,4886,4888,4890,4892,4894,4896],{"class":1061,"line":1062},[1059,4883,1932],{"class":1180},[1059,4885,1935],{"class":1100},[1059,4887,1088],{"class":1080},[1059,4889,2832],{"class":1100},[1059,4891,1952],{"class":1180},[1059,4893,2837],{"class":1100},[1059,4895,1524],{"class":1080},[1059,4897,2842],{"class":1100},[1059,4899,4900,4902,4904,4906,4909,4911,4914,4916,4919,4921,4924,4926],{"class":1061,"line":1069},[1059,4901,1932],{"class":1180},[1059,4903,1935],{"class":1100},[1059,4905,1088],{"class":1080},[1059,4907,4908],{"class":1100},"views",[1059,4910,1088],{"class":1080},[1059,4912,4913],{"class":1100},"generic ",[1059,4915,1952],{"class":1180},[1059,4917,4918],{"class":1100}," ListView",[1059,4920,1524],{"class":1080},[1059,4922,4923],{"class":1100}," DetailView",[1059,4925,1524],{"class":1080},[1059,4927,4928],{"class":1100}," CreateView\n",[1059,4930,4931,4933,4935,4937,4939,4941,4943,4945,4948,4950],{"class":1061,"line":1097},[1059,4932,1932],{"class":1180},[1059,4934,1935],{"class":1100},[1059,4936,1088],{"class":1080},[1059,4938,4043],{"class":1100},[1059,4940,1088],{"class":1080},[1059,4942,4048],{"class":1100},[1059,4944,1088],{"class":1080},[1059,4946,4947],{"class":1100},"mixins ",[1059,4949,1952],{"class":1180},[1059,4951,4952],{"class":1100}," LoginRequiredMixin\n",[1059,4954,4955,4957,4959,4961,4963,4965,4967,4969],{"class":1061,"line":1119},[1059,4956,1932],{"class":1180},[1059,4958,1935],{"class":1100},[1059,4960,1088],{"class":1080},[1059,4962,1940],{"class":1100},[1059,4964,1088],{"class":1080},[1059,4966,4053],{"class":1100},[1059,4968,1952],{"class":1180},[1059,4970,4971],{"class":1100}," Q\n",[1059,4973,4974],{"class":1061,"line":1125},[1059,4975,1254],{"emptyLinePlaceholder":1253},[1059,4977,4978],{"class":1061,"line":1143},[1059,4979,4980],{"class":1065},"# Function-based view\n",[1059,4982,4983,4985,4988,4990,4992],{"class":1061,"line":1177},[1059,4984,2005],{"class":1072},[1059,4986,4987],{"class":1131}," product_search",[1059,4989,1081],{"class":1080},[1059,4991,2874],{"class":2013},[1059,4993,1094],{"class":1080},[1059,4995,4996,4999,5001,5003,5005,5008,5010,5013,5015,5017,5020,5022],{"class":1061,"line":1215},[1059,4997,4998],{"class":1100},"    query ",[1059,5000,1104],{"class":1080},[1059,5002,3617],{"class":1100},[1059,5004,1088],{"class":1080},[1059,5006,5007],{"class":1745},"GET",[1059,5009,1088],{"class":1080},[1059,5011,5012],{"class":1112},"get",[1059,5014,1081],{"class":1080},[1059,5016,1165],{"class":1164},[1059,5018,5019],{"class":1168},"q",[1059,5021,1165],{"class":1164},[1059,5023,1238],{"class":1080},[1059,5025,5026,5028,5030],{"class":1061,"line":1241},[1059,5027,2891],{"class":1100},[1059,5029,1104],{"class":1080},[1059,5031,5032],{"class":1080}," []\n",[1059,5034,5035],{"class":1061,"line":1250},[1059,5036,1122],{"class":1100},[1059,5038,5039,5041,5044],{"class":1061,"line":1257},[1059,5040,2039],{"class":1180},[1059,5042,5043],{"class":1100}," query",[1059,5045,1411],{"class":1080},[1059,5047,5048,5051,5053,5055,5057,5059,5061,5063],{"class":1061,"line":1275},[1059,5049,5050],{"class":1100},"        products ",[1059,5052,1104],{"class":1080},[1059,5054,2591],{"class":1100},[1059,5056,1088],{"class":1080},[1059,5058,1189],{"class":1157},[1059,5060,1088],{"class":1080},[1059,5062,1194],{"class":1112},[1059,5064,1721],{"class":1080},[1059,5066,5067,5070,5072,5075,5077,5080,5083,5086],{"class":1061,"line":1290},[1059,5068,5069],{"class":1112},"            Q",[1059,5071,1081],{"class":1080},[1059,5073,5074],{"class":1199},"name__icontains",[1059,5076,1104],{"class":1080},[1059,5078,5079],{"class":1112},"query",[1059,5081,5082],{"class":1080},")",[1059,5084,5085],{"class":1863}," |",[1059,5087,1731],{"class":1112},[1059,5089,5090,5092,5094,5097,5099,5101],{"class":1061,"line":1295},[1059,5091,5069],{"class":1112},[1059,5093,1081],{"class":1080},[1059,5095,5096],{"class":1199},"description__icontains",[1059,5098,1104],{"class":1080},[1059,5100,5079],{"class":1112},[1059,5102,1238],{"class":1080},[1059,5104,5105,5107,5110,5112,5114,5116,5118],{"class":1061,"line":1308},[1059,5106,3842],{"class":1080},[1059,5108,5109],{"class":1112},"select_related",[1059,5111,1081],{"class":1080},[1059,5113,1165],{"class":1164},[1059,5115,4705],{"class":1168},[1059,5117,1165],{"class":1164},[1059,5119,1238],{"class":1080},[1059,5121,5122],{"class":1061,"line":1331},[1059,5123,1122],{"class":1100},[1059,5125,5126,5128,5130],{"class":1061,"line":1364},[1059,5127,2919],{"class":1100},[1059,5129,1104],{"class":1080},[1059,5131,3100],{"class":1080},[1059,5133,5134,5136,5138,5140,5142,5144],{"class":1061,"line":1385},[1059,5135,1793],{"class":1164},[1059,5137,2929],{"class":1168},[1059,5139,1165],{"class":1164},[1059,5141,2934],{"class":1080},[1059,5143,2937],{"class":1100},[1059,5145,1819],{"class":1080},[1059,5147,5148,5150,5152,5154,5156,5158],{"class":1061,"line":1392},[1059,5149,1793],{"class":1164},[1059,5151,5079],{"class":1168},[1059,5153,1165],{"class":1164},[1059,5155,2934],{"class":1080},[1059,5157,5043],{"class":1100},[1059,5159,1819],{"class":1080},[1059,5161,5162],{"class":1061,"line":1397},[1059,5163,3169],{"class":1080},[1059,5165,5166,5168,5170,5172,5174,5176,5178,5181,5183,5185,5187],{"class":1061,"line":1403},[1059,5167,2945],{"class":1180},[1059,5169,2837],{"class":1112},[1059,5171,1081],{"class":1080},[1059,5173,2874],{"class":1112},[1059,5175,1524],{"class":1080},[1059,5177,2533],{"class":1164},[1059,5179,5180],{"class":1168},"products/search.html",[1059,5182,1165],{"class":1164},[1059,5184,1524],{"class":1080},[1059,5186,2965],{"class":1112},[1059,5188,1238],{"class":1080},[1059,5190,5191],{"class":1061,"line":1414},[1059,5192,1254],{"emptyLinePlaceholder":1253},[1059,5194,5195],{"class":1061,"line":1427},[1059,5196,5197],{"class":1065},"# Class-based views\n",[1059,5199,5200,5202,5205,5207,5209],{"class":1061,"line":1450},[1059,5201,1073],{"class":1072},[1059,5203,5204],{"class":1076}," ProductListView",[1059,5206,1081],{"class":1080},[1059,5208,2511],{"class":1084},[1059,5210,1094],{"class":1080},[1059,5212,5213,5215,5217],{"class":1061,"line":1479},[1059,5214,2518],{"class":1100},[1059,5216,1104],{"class":1080},[1059,5218,3003],{"class":1100},[1059,5220,5221,5223,5225,5227,5229],{"class":1061,"line":1500},[1059,5222,2528],{"class":1100},[1059,5224,1104],{"class":1080},[1059,5226,2533],{"class":1164},[1059,5228,2958],{"class":1168},[1059,5230,2539],{"class":1164},[1059,5232,5233,5235,5237,5239,5241],{"class":1061,"line":1507},[1059,5234,2544],{"class":1100},[1059,5236,1104],{"class":1080},[1059,5238,2533],{"class":1164},[1059,5240,2929],{"class":1168},[1059,5242,2539],{"class":1164},[1059,5244,5245,5247,5249],{"class":1061,"line":1512},[1059,5246,2558],{"class":1100},[1059,5248,1104],{"class":1080},[1059,5250,5251],{"class":2323}," 12\n",[1059,5253,5254],{"class":1061,"line":1535},[1059,5255,1122],{"class":1100},[1059,5257,5258,5260,5263,5265,5267],{"class":1061,"line":1550},[1059,5259,1128],{"class":1072},[1059,5261,5262],{"class":1131}," get_queryset",[1059,5264,1081],{"class":1080},[1059,5266,1138],{"class":1137},[1059,5268,1094],{"class":1080},[1059,5270,5271,5274,5276,5278,5280,5282,5284,5286,5288,5290,5292,5294],{"class":1061,"line":1555},[1059,5272,5273],{"class":1100},"        queryset ",[1059,5275,1104],{"class":1080},[1059,5277,2591],{"class":1100},[1059,5279,1088],{"class":1080},[1059,5281,1189],{"class":1157},[1059,5283,1088],{"class":1080},[1059,5285,5109],{"class":1112},[1059,5287,1081],{"class":1080},[1059,5289,1165],{"class":1164},[1059,5291,4705],{"class":1168},[1059,5293,1165],{"class":1164},[1059,5295,1238],{"class":1080},[1059,5297,5298,5301,5303,5305,5307,5309,5311,5313,5315,5317,5320,5322],{"class":1061,"line":1576},[1059,5299,5300],{"class":1100},"        category_slug ",[1059,5302,1104],{"class":1080},[1059,5304,1152],{"class":1151},[1059,5306,1088],{"class":1080},[1059,5308,2032],{"class":1157},[1059,5310,1088],{"class":1080},[1059,5312,5012],{"class":1112},[1059,5314,1081],{"class":1080},[1059,5316,1165],{"class":1164},[1059,5318,5319],{"class":1168},"category_slug",[1059,5321,1165],{"class":1164},[1059,5323,1238],{"class":1080},[1059,5325,5326],{"class":1061,"line":3054},[1059,5327,3650],{"class":1100},[1059,5329,5330,5332,5335],{"class":1061,"line":3064},[1059,5331,1181],{"class":1180},[1059,5333,5334],{"class":1100}," category_slug",[1059,5336,1411],{"class":1080},[1059,5338,5339,5342,5344,5347,5349,5351,5353,5356,5358,5360],{"class":1061,"line":3092},[1059,5340,5341],{"class":1100},"            queryset ",[1059,5343,1104],{"class":1080},[1059,5345,5346],{"class":1100}," queryset",[1059,5348,1088],{"class":1080},[1059,5350,1194],{"class":1112},[1059,5352,1081],{"class":1080},[1059,5354,5355],{"class":1199},"category__slug",[1059,5357,1104],{"class":1080},[1059,5359,5319],{"class":1112},[1059,5361,1238],{"class":1080},[1059,5363,5364],{"class":1061,"line":3103},[1059,5365,3650],{"class":1100},[1059,5367,5368,5370],{"class":1061,"line":3124},[1059,5369,1244],{"class":1180},[1059,5371,5372],{"class":1100}," queryset\n",[1059,5374,5375],{"class":1061,"line":3148},[1059,5376,1122],{"class":1100},[1059,5378,5379,5381,5383,5385,5387,5389,5391,5393],{"class":1061,"line":3166},[1059,5380,1128],{"class":1072},[1059,5382,3751],{"class":1131},[1059,5384,1081],{"class":1080},[1059,5386,1138],{"class":1137},[1059,5388,1524],{"class":1080},[1059,5390,2029],{"class":1863},[1059,5392,2032],{"class":2013},[1059,5394,1094],{"class":1080},[1059,5396,5397,5399,5401,5403,5405,5407,5409,5411,5413],{"class":1061,"line":3172},[1059,5398,3768],{"class":1100},[1059,5400,1104],{"class":1080},[1059,5402,3773],{"class":2782},[1059,5404,3776],{"class":1080},[1059,5406,3779],{"class":1112},[1059,5408,1081],{"class":1080},[1059,5410,3784],{"class":1863},[1059,5412,2032],{"class":1112},[1059,5414,1238],{"class":1080},[1059,5416,5417,5419,5421,5423,5425,5427,5429,5431,5433,5435,5437,5439,5442],{"class":1061,"line":3187},[1059,5418,3793],{"class":1100},[1059,5420,1161],{"class":1080},[1059,5422,1165],{"class":1164},[1059,5424,4198],{"class":1168},[1059,5426,1165],{"class":1164},[1059,5428,3695],{"class":1080},[1059,5430,2207],{"class":1080},[1059,5432,4085],{"class":1100},[1059,5434,1088],{"class":1080},[1059,5436,1189],{"class":1157},[1059,5438,1088],{"class":1080},[1059,5440,5441],{"class":1112},"all",[1059,5443,1116],{"class":1080},[1059,5445,5446,5448],{"class":1061,"line":3192},[1059,5447,1244],{"class":1180},[1059,5449,3877],{"class":1100},[1059,5451,5452],{"class":1061,"line":3198},[1059,5453,1254],{"emptyLinePlaceholder":1253},[1059,5455,5456,5458,5461,5463,5466,5468,5471],{"class":1061,"line":3204},[1059,5457,1073],{"class":1072},[1059,5459,5460],{"class":1076}," ProductCreateView",[1059,5462,1081],{"class":1080},[1059,5464,5465],{"class":1084},"LoginRequiredMixin",[1059,5467,1524],{"class":1080},[1059,5469,5470],{"class":1084}," CreateView",[1059,5472,1094],{"class":1080},[1059,5474,5475,5477,5479],{"class":1061,"line":3223},[1059,5476,2518],{"class":1100},[1059,5478,1104],{"class":1080},[1059,5480,3003],{"class":1100},[1059,5482,5483,5486,5488,5490,5492,5494,5496,5498,5500,5502,5504,5506,5508,5510,5512,5514,5516,5518,5520,5522,5524,5527,5529,5531,5533,5536,5538],{"class":1061,"line":3228},[1059,5484,5485],{"class":1100},"    fields ",[1059,5487,1104],{"class":1080},[1059,5489,2450],{"class":1080},[1059,5491,1165],{"class":1164},[1059,5493,3108],{"class":1168},[1059,5495,1165],{"class":1164},[1059,5497,1524],{"class":1080},[1059,5499,2533],{"class":1164},[1059,5501,4705],{"class":1168},[1059,5503,1165],{"class":1164},[1059,5505,1524],{"class":1080},[1059,5507,2533],{"class":1164},[1059,5509,2747],{"class":1168},[1059,5511,1165],{"class":1164},[1059,5513,1524],{"class":1080},[1059,5515,2533],{"class":1164},[1059,5517,4858],{"class":1168},[1059,5519,1165],{"class":1164},[1059,5521,1524],{"class":1080},[1059,5523,2533],{"class":1164},[1059,5525,5526],{"class":1168},"description",[1059,5528,1165],{"class":1164},[1059,5530,1524],{"class":1080},[1059,5532,2533],{"class":1164},[1059,5534,5535],{"class":1168},"image",[1059,5537,1165],{"class":1164},[1059,5539,1174],{"class":1080},[1059,5541,5542,5544,5546,5548,5551],{"class":1061,"line":3242},[1059,5543,2528],{"class":1100},[1059,5545,1104],{"class":1080},[1059,5547,2533],{"class":1164},[1059,5549,5550],{"class":1168},"products/create.html",[1059,5552,2539],{"class":1164},[1059,5554,5555],{"class":1061,"line":3264},[1059,5556,1122],{"class":1100},[1059,5558,5559,5561,5564,5566,5568,5570,5573],{"class":1061,"line":3288},[1059,5560,1128],{"class":1072},[1059,5562,5563],{"class":1131}," form_valid",[1059,5565,1081],{"class":1080},[1059,5567,1138],{"class":1137},[1059,5569,1524],{"class":1080},[1059,5571,5572],{"class":2013}," form",[1059,5574,1094],{"class":1080},[1059,5576,5577,5580,5582,5584,5586,5589,5591,5593,5595,5597,5599],{"class":1061,"line":3310},[1059,5578,5579],{"class":1100},"        form",[1059,5581,1088],{"class":1080},[1059,5583,2067],{"class":1157},[1059,5585,1088],{"class":1080},[1059,5587,5588],{"class":1157},"seller",[1059,5590,2207],{"class":1080},[1059,5592,1152],{"class":1151},[1059,5594,1088],{"class":1080},[1059,5596,2874],{"class":1157},[1059,5598,1088],{"class":1080},[1059,5600,5601],{"class":1157},"user\n",[1059,5603,5604,5606,5608,5610,5613,5615,5618],{"class":1061,"line":3338},[1059,5605,1244],{"class":1180},[1059,5607,3773],{"class":2782},[1059,5609,3776],{"class":1080},[1059,5611,5612],{"class":1112},"form_valid",[1059,5614,1081],{"class":1080},[1059,5616,5617],{"class":1112},"form",[1059,5619,1238],{"class":1080},[1035,5621,5623],{"id":5622},"_3-templates-the-presentation-layer","3. Templates: The Presentation Layer",[1026,5625,5626],{},"Templates separate presentation from logic:",[1049,5628,5632],{"className":5629,"code":5630,"language":5631,"meta":1054,"style":1054},"language-html shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","\u003C!-- base.html -->\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    \u003Ctitle>{% block title %}My Store{% endblock %}\u003C/title>\n    {% load static %}\n    \u003Clink rel=\"stylesheet\" href=\"{% static 'css/main.css' %}\">\n    {% block extra_css %}{% endblock %}\n\u003C/head>\n\u003Cbody>\n    \u003Cheader>\n        \u003Cnav class=\"navbar\">\n            \u003Ca href=\"{% url 'home' %}\" class=\"logo\">My Store\u003C/a>\n            \u003Cul class=\"nav-links\">\n                \u003Cli>\u003Ca href=\"{% url 'product_list' %}\">Products\u003C/a>\u003C/li>\n                {% if user.is_authenticated %}\n                    \u003Cli>\u003Ca href=\"{% url 'profile' %}\">Profile\u003C/a>\u003C/li>\n                    \u003Cli>\u003Ca href=\"{% url 'logout' %}\">Logout\u003C/a>\u003C/li>\n                {% else %}\n                    \u003Cli>\u003Ca href=\"{% url 'login' %}\">Login\u003C/a>\u003C/li>\n                {% endif %}\n            \u003C/ul>\n        \u003C/nav>\n    \u003C/header>\n    \n    \u003Cmain>\n        {% if messages %}\n            {% for message in messages %}\n                \u003Cdiv class=\"alert alert-{{ message.tags }}\">\n                    {{ message }}\n                \u003C/div>\n            {% endfor %}\n        {% endif %}\n        \n        {% block content %}{% endblock %}\n    \u003C/main>\n    \n    \u003Cfooter>\n        \u003Cp>&copy; 2024 My Store. All rights reserved.\u003C/p>\n    \u003C/footer>\n    \n    \u003Cscript src=\"{% static 'js/main.js' %}\">\u003C/script>\n    {% block extra_js %}{% endblock %}\n\u003C/body>\n\u003C/html>\n\n\u003C!-- products/list.html -->\n{% extends 'base.html' %}\n{% load static %}\n\n{% block title %}Products - {{ block.super }}{% endblock %}\n\n{% block content %}\n    \u003Cdiv class=\"container\">\n        \u003Ch1>Products\u003C/h1>\n        \n        \u003Cdiv class=\"filters\">\n            \u003Ch3>Categories\u003C/h3>\n            \u003Cul>\n                \u003Cli>\u003Ca href=\"{% url 'product_list' %}\">All\u003C/a>\u003C/li>\n                {% for category in categories %}\n                    \u003Cli>\n                        \u003Ca href=\"{% url 'category_products' category.slug %}\">\n                            {{ category.name }}\n                        \u003C/a>\n                    \u003C/li>\n                {% endfor %}\n            \u003C/ul>\n        \u003C/div>\n        \n        \u003Cdiv class=\"products-grid\">\n            {% for product in products %}\n                \u003Cdiv class=\"product-card\">\n                    {% if product.image %}\n                        \u003Cimg src=\"{{ product.image.url }}\" alt=\"{{ product.name }}\">\n                    {% endif %}\n                    \u003Ch3>\n                        \u003Ca href=\"{{ product.get_absolute_url }}\">\n                            {{ product.name }}\n                        \u003C/a>\n                    \u003C/h3>\n                    \u003Cp class=\"price\">${{ product.price }}\u003C/p>\n                    \u003Cp class=\"condition\">{{ product.get_condition_display }}\u003C/p>\n                \u003C/div>\n            {% empty %}\n                \u003Cp>No products found.\u003C/p>\n            {% endfor %}\n        \u003C/div>\n        \n        {% if is_paginated %}\n            \u003Cdiv class=\"pagination\">\n                \u003Cspan class=\"page-links\">\n                    {% if page_obj.has_previous %}\n                        \u003Ca href=\"?page=1\">&laquo; first\u003C/a>\n                        \u003Ca href=\"?page={{ page_obj.previous_page_number }}\">previous\u003C/a>\n                    {% endif %}\n                    \n                    \u003Cspan class=\"current\">\n                        Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}\n                    \u003C/span>\n                    \n                    {% if page_obj.has_next %}\n                        \u003Ca href=\"?page={{ page_obj.next_page_number }}\">next\u003C/a>\n                        \u003Ca href=\"?page={{ page_obj.paginator.num_pages }}\">last &raquo;\u003C/a>\n                    {% endif %}\n                \u003C/span>\n            \u003C/div>\n        {% endif %}\n    \u003C/div>\n{% endblock %}\n","html",[1056,5633,5634,5639,5654,5675,5684,5705,5736,5754,5759,5792,5797,5805,5814,5823,5844,5884,5904,5942,5947,5984,6020,6025,6061,6066,6075,6083,6092,6096,6105,6110,6115,6134,6139,6148,6153,6158,6162,6167,6175,6179,6188,6215,6223,6227,6252,6257,6265,6273,6277,6282,6287,6292,6296,6301,6305,6310,6329,6345,6350,6370,6388,6397,6433,6439,6448,6469,6475,6485,6495,6501,6510,6519,6524,6544,6550,6569,6575,6608,6614,6623,6643,6649,6658,6667,6695,6723,6732,6738,6756,6761,6770,6775,6781,6801,6821,6827,6863,6892,6897,6903,6923,6929,6938,6943,6949,6978,7014,7019,7028,7037,7042,7051],{"__ignoreMap":1054},[1059,5635,5636],{"class":1061,"line":1062},[1059,5637,5638],{"class":1065},"\u003C!-- base.html -->\n",[1059,5640,5641,5644,5648,5652],{"class":1061,"line":1069},[1059,5642,5643],{"class":1080},"\u003C!",[1059,5645,5647],{"class":5646},"sJFLg","DOCTYPE",[1059,5649,5651],{"class":5650},"s5q8q"," html",[1059,5653,3261],{"class":1080},[1059,5655,5656,5659,5661,5664,5666,5668,5671,5673],{"class":1061,"line":1097},[1059,5657,5658],{"class":1080},"\u003C",[1059,5660,5631],{"class":5646},[1059,5662,5663],{"class":5650}," lang",[1059,5665,1104],{"class":1080},[1059,5667,1230],{"class":1164},[1059,5669,5670],{"class":1168},"en",[1059,5672,1230],{"class":1164},[1059,5674,3261],{"class":1080},[1059,5676,5677,5679,5682],{"class":1061,"line":1119},[1059,5678,5658],{"class":1080},[1059,5680,5681],{"class":5646},"head",[1059,5683,3261],{"class":1080},[1059,5685,5686,5688,5691,5694,5696,5698,5701,5703],{"class":1061,"line":1125},[1059,5687,3245],{"class":1080},[1059,5689,5690],{"class":5646},"meta",[1059,5692,5693],{"class":5650}," charset",[1059,5695,1104],{"class":1080},[1059,5697,1230],{"class":1164},[1059,5699,5700],{"class":1168},"UTF-8",[1059,5702,1230],{"class":1164},[1059,5704,3261],{"class":1080},[1059,5706,5707,5709,5711,5713,5715,5717,5720,5722,5725,5727,5729,5732,5734],{"class":1061,"line":1143},[1059,5708,3245],{"class":1080},[1059,5710,5690],{"class":5646},[1059,5712,3533],{"class":5650},[1059,5714,1104],{"class":1080},[1059,5716,1230],{"class":1164},[1059,5718,5719],{"class":1168},"viewport",[1059,5721,1230],{"class":1164},[1059,5723,5724],{"class":5650}," content",[1059,5726,1104],{"class":1080},[1059,5728,1230],{"class":1164},[1059,5730,5731],{"class":1168},"width=device-width, initial-scale=1.0",[1059,5733,1230],{"class":1164},[1059,5735,3261],{"class":1080},[1059,5737,5738,5740,5743,5745,5748,5750,5752],{"class":1061,"line":1177},[1059,5739,3245],{"class":1080},[1059,5741,5742],{"class":5646},"title",[1059,5744,3250],{"class":1080},[1059,5746,5747],{"class":1100},"{% block title %}My Store{% endblock %}",[1059,5749,3256],{"class":1080},[1059,5751,5742],{"class":5646},[1059,5753,3261],{"class":1080},[1059,5755,5756],{"class":1061,"line":1215},[1059,5757,5758],{"class":1100},"    {% load static %}\n",[1059,5760,5761,5763,5766,5769,5771,5773,5776,5778,5781,5783,5785,5788,5790],{"class":1061,"line":1241},[1059,5762,3245],{"class":1080},[1059,5764,5765],{"class":5646},"link",[1059,5767,5768],{"class":5650}," rel",[1059,5770,1104],{"class":1080},[1059,5772,1230],{"class":1164},[1059,5774,5775],{"class":1168},"stylesheet",[1059,5777,1230],{"class":1164},[1059,5779,5780],{"class":5650}," href",[1059,5782,1104],{"class":1080},[1059,5784,1230],{"class":1164},[1059,5786,5787],{"class":1168},"{% static 'css/main.css' %}",[1059,5789,1230],{"class":1164},[1059,5791,3261],{"class":1080},[1059,5793,5794],{"class":1061,"line":1250},[1059,5795,5796],{"class":1100},"    {% block extra_css %}{% endblock %}\n",[1059,5798,5799,5801,5803],{"class":1061,"line":1257},[1059,5800,3256],{"class":1080},[1059,5802,5681],{"class":5646},[1059,5804,3261],{"class":1080},[1059,5806,5807,5809,5812],{"class":1061,"line":1275},[1059,5808,5658],{"class":1080},[1059,5810,5811],{"class":5646},"body",[1059,5813,3261],{"class":1080},[1059,5815,5816,5818,5821],{"class":1061,"line":1290},[1059,5817,3245],{"class":1080},[1059,5819,5820],{"class":5646},"header",[1059,5822,3261],{"class":1080},[1059,5824,5825,5827,5830,5833,5835,5837,5840,5842],{"class":1061,"line":1295},[1059,5826,3291],{"class":1080},[1059,5828,5829],{"class":5646},"nav",[1059,5831,5832],{"class":5650}," class",[1059,5834,1104],{"class":1080},[1059,5836,1230],{"class":1164},[1059,5838,5839],{"class":1168},"navbar",[1059,5841,1230],{"class":1164},[1059,5843,3261],{"class":1080},[1059,5845,5846,5848,5851,5853,5855,5857,5860,5862,5864,5866,5868,5871,5873,5875,5878,5880,5882],{"class":1061,"line":1308},[1059,5847,3313],{"class":1080},[1059,5849,5850],{"class":5646},"a",[1059,5852,5780],{"class":5650},[1059,5854,1104],{"class":1080},[1059,5856,1230],{"class":1164},[1059,5858,5859],{"class":1168},"{% url 'home' %}",[1059,5861,1230],{"class":1164},[1059,5863,5832],{"class":5650},[1059,5865,1104],{"class":1080},[1059,5867,1230],{"class":1164},[1059,5869,5870],{"class":1168},"logo",[1059,5872,1230],{"class":1164},[1059,5874,3250],{"class":1080},[1059,5876,5877],{"class":1100},"My Store",[1059,5879,3256],{"class":1080},[1059,5881,5850],{"class":5646},[1059,5883,3261],{"class":1080},[1059,5885,5886,5888,5891,5893,5895,5897,5900,5902],{"class":1061,"line":1331},[1059,5887,3313],{"class":1080},[1059,5889,5890],{"class":5646},"ul",[1059,5892,5832],{"class":5650},[1059,5894,1104],{"class":1080},[1059,5896,1230],{"class":1164},[1059,5898,5899],{"class":1168},"nav-links",[1059,5901,1230],{"class":1164},[1059,5903,3261],{"class":1080},[1059,5905,5906,5908,5911,5914,5916,5918,5920,5922,5925,5927,5929,5931,5933,5935,5938,5940],{"class":1061,"line":1364},[1059,5907,3392],{"class":1080},[1059,5909,5910],{"class":5646},"li",[1059,5912,5913],{"class":1080},">\u003C",[1059,5915,5850],{"class":5646},[1059,5917,5780],{"class":5650},[1059,5919,1104],{"class":1080},[1059,5921,1230],{"class":1164},[1059,5923,5924],{"class":1168},"{% url 'product_list' %}",[1059,5926,1230],{"class":1164},[1059,5928,3250],{"class":1080},[1059,5930,3253],{"class":1100},[1059,5932,3256],{"class":1080},[1059,5934,5850],{"class":5646},[1059,5936,5937],{"class":1080},">\u003C/",[1059,5939,5910],{"class":5646},[1059,5941,3261],{"class":1080},[1059,5943,5944],{"class":1061,"line":1385},[1059,5945,5946],{"class":1100},"                {% if user.is_authenticated %}\n",[1059,5948,5949,5952,5954,5956,5958,5960,5962,5964,5967,5969,5971,5974,5976,5978,5980,5982],{"class":1061,"line":1392},[1059,5950,5951],{"class":1080},"                    \u003C",[1059,5953,5910],{"class":5646},[1059,5955,5913],{"class":1080},[1059,5957,5850],{"class":5646},[1059,5959,5780],{"class":5650},[1059,5961,1104],{"class":1080},[1059,5963,1230],{"class":1164},[1059,5965,5966],{"class":1168},"{% url 'profile' %}",[1059,5968,1230],{"class":1164},[1059,5970,3250],{"class":1080},[1059,5972,5973],{"class":1100},"Profile",[1059,5975,3256],{"class":1080},[1059,5977,5850],{"class":5646},[1059,5979,5937],{"class":1080},[1059,5981,5910],{"class":5646},[1059,5983,3261],{"class":1080},[1059,5985,5986,5988,5990,5992,5994,5996,5998,6000,6003,6005,6007,6010,6012,6014,6016,6018],{"class":1061,"line":1397},[1059,5987,5951],{"class":1080},[1059,5989,5910],{"class":5646},[1059,5991,5913],{"class":1080},[1059,5993,5850],{"class":5646},[1059,5995,5780],{"class":5650},[1059,5997,1104],{"class":1080},[1059,5999,1230],{"class":1164},[1059,6001,6002],{"class":1168},"{% url 'logout' %}",[1059,6004,1230],{"class":1164},[1059,6006,3250],{"class":1080},[1059,6008,6009],{"class":1100},"Logout",[1059,6011,3256],{"class":1080},[1059,6013,5850],{"class":5646},[1059,6015,5937],{"class":1080},[1059,6017,5910],{"class":5646},[1059,6019,3261],{"class":1080},[1059,6021,6022],{"class":1061,"line":1403},[1059,6023,6024],{"class":1100},"                {% else %}\n",[1059,6026,6027,6029,6031,6033,6035,6037,6039,6041,6044,6046,6048,6051,6053,6055,6057,6059],{"class":1061,"line":1414},[1059,6028,5951],{"class":1080},[1059,6030,5910],{"class":5646},[1059,6032,5913],{"class":1080},[1059,6034,5850],{"class":5646},[1059,6036,5780],{"class":5650},[1059,6038,1104],{"class":1080},[1059,6040,1230],{"class":1164},[1059,6042,6043],{"class":1168},"{% url 'login' %}",[1059,6045,1230],{"class":1164},[1059,6047,3250],{"class":1080},[1059,6049,6050],{"class":1100},"Login",[1059,6052,3256],{"class":1080},[1059,6054,5850],{"class":5646},[1059,6056,5937],{"class":1080},[1059,6058,5910],{"class":5646},[1059,6060,3261],{"class":1080},[1059,6062,6063],{"class":1061,"line":1427},[1059,6064,6065],{"class":1100},"                {% endif %}\n",[1059,6067,6068,6071,6073],{"class":1061,"line":1450},[1059,6069,6070],{"class":1080},"            \u003C/",[1059,6072,5890],{"class":5646},[1059,6074,3261],{"class":1080},[1059,6076,6077,6079,6081],{"class":1061,"line":1479},[1059,6078,3437],{"class":1080},[1059,6080,5829],{"class":5646},[1059,6082,3261],{"class":1080},[1059,6084,6085,6088,6090],{"class":1061,"line":1500},[1059,6086,6087],{"class":1080},"    \u003C/",[1059,6089,5820],{"class":5646},[1059,6091,3261],{"class":1080},[1059,6093,6094],{"class":1061,"line":1507},[1059,6095,1122],{"class":1100},[1059,6097,6098,6100,6103],{"class":1061,"line":1512},[1059,6099,3245],{"class":1080},[1059,6101,6102],{"class":5646},"main",[1059,6104,3261],{"class":1080},[1059,6106,6107],{"class":1061,"line":1535},[1059,6108,6109],{"class":1100},"        {% if messages %}\n",[1059,6111,6112],{"class":1061,"line":1550},[1059,6113,6114],{"class":1100},"            {% for message in messages %}\n",[1059,6116,6117,6119,6121,6123,6125,6127,6130,6132],{"class":1061,"line":1555},[1059,6118,3392],{"class":1080},[1059,6120,3440],{"class":5646},[1059,6122,5832],{"class":5650},[1059,6124,1104],{"class":1080},[1059,6126,1230],{"class":1164},[1059,6128,6129],{"class":1168},"alert alert-{{ message.tags }}",[1059,6131,1230],{"class":1164},[1059,6133,3261],{"class":1080},[1059,6135,6136],{"class":1061,"line":1576},[1059,6137,6138],{"class":1100},"                    {{ message }}\n",[1059,6140,6141,6144,6146],{"class":1061,"line":3054},[1059,6142,6143],{"class":1080},"                \u003C/",[1059,6145,3440],{"class":5646},[1059,6147,3261],{"class":1080},[1059,6149,6150],{"class":1061,"line":3064},[1059,6151,6152],{"class":1100},"            {% endfor %}\n",[1059,6154,6155],{"class":1061,"line":3092},[1059,6156,6157],{"class":1100},"        {% endif %}\n",[1059,6159,6160],{"class":1061,"line":3103},[1059,6161,3650],{"class":1100},[1059,6163,6164],{"class":1061,"line":3124},[1059,6165,6166],{"class":1100},"        {% block content %}{% endblock %}\n",[1059,6168,6169,6171,6173],{"class":1061,"line":3148},[1059,6170,6087],{"class":1080},[1059,6172,6102],{"class":5646},[1059,6174,3261],{"class":1080},[1059,6176,6177],{"class":1061,"line":3166},[1059,6178,1122],{"class":1100},[1059,6180,6181,6183,6186],{"class":1061,"line":3172},[1059,6182,3245],{"class":1080},[1059,6184,6185],{"class":5646},"footer",[1059,6187,3261],{"class":1080},[1059,6189,6190,6192,6194,6196,6200,6203,6206,6209,6211,6213],{"class":1061,"line":3187},[1059,6191,3291],{"class":1080},[1059,6193,1026],{"class":5646},[1059,6195,3250],{"class":1080},[1059,6197,6199],{"class":6198},"snCua","&",[1059,6201,6202],{"class":1151},"copy",[1059,6204,6205],{"class":6198},";",[1059,6207,6208],{"class":1100}," 2024 My Store. All rights reserved.",[1059,6210,3256],{"class":1080},[1059,6212,1026],{"class":5646},[1059,6214,3261],{"class":1080},[1059,6216,6217,6219,6221],{"class":1061,"line":3192},[1059,6218,6087],{"class":1080},[1059,6220,6185],{"class":5646},[1059,6222,3261],{"class":1080},[1059,6224,6225],{"class":1061,"line":3198},[1059,6226,1122],{"class":1100},[1059,6228,6229,6231,6234,6237,6239,6241,6244,6246,6248,6250],{"class":1061,"line":3204},[1059,6230,3245],{"class":1080},[1059,6232,6233],{"class":5646},"script",[1059,6235,6236],{"class":5650}," src",[1059,6238,1104],{"class":1080},[1059,6240,1230],{"class":1164},[1059,6242,6243],{"class":1168},"{% static 'js/main.js' %}",[1059,6245,1230],{"class":1164},[1059,6247,5937],{"class":1080},[1059,6249,6233],{"class":5646},[1059,6251,3261],{"class":1080},[1059,6253,6254],{"class":1061,"line":3223},[1059,6255,6256],{"class":1100},"    {% block extra_js %}{% endblock %}\n",[1059,6258,6259,6261,6263],{"class":1061,"line":3228},[1059,6260,3256],{"class":1080},[1059,6262,5811],{"class":5646},[1059,6264,3261],{"class":1080},[1059,6266,6267,6269,6271],{"class":1061,"line":3242},[1059,6268,3256],{"class":1080},[1059,6270,5631],{"class":5646},[1059,6272,3261],{"class":1080},[1059,6274,6275],{"class":1061,"line":3264},[1059,6276,1254],{"emptyLinePlaceholder":1253},[1059,6278,6279],{"class":1061,"line":3288},[1059,6280,6281],{"class":1065},"\u003C!-- products/list.html -->\n",[1059,6283,6284],{"class":1061,"line":3310},[1059,6285,6286],{"class":1100},"{% extends 'base.html' %}\n",[1059,6288,6289],{"class":1061,"line":3338},[1059,6290,6291],{"class":1100},"{% load static %}\n",[1059,6293,6294],{"class":1061,"line":3367},[1059,6295,1254],{"emptyLinePlaceholder":1253},[1059,6297,6298],{"class":1061,"line":3389},[1059,6299,6300],{"class":1100},"{% block title %}Products - {{ block.super }}{% endblock %}\n",[1059,6302,6303],{"class":1061,"line":3420},[1059,6304,1254],{"emptyLinePlaceholder":1253},[1059,6306,6307],{"class":1061,"line":3434},[1059,6308,6309],{"class":1100},"{% block content %}\n",[1059,6311,6312,6314,6316,6318,6320,6322,6325,6327],{"class":1061,"line":3445},[1059,6313,3245],{"class":1080},[1059,6315,3440],{"class":5646},[1059,6317,5832],{"class":5650},[1059,6319,1104],{"class":1080},[1059,6321,1230],{"class":1164},[1059,6323,6324],{"class":1168},"container",[1059,6326,1230],{"class":1164},[1059,6328,3261],{"class":1080},[1059,6330,6331,6333,6335,6337,6339,6341,6343],{"class":1061,"line":3459},[1059,6332,3291],{"class":1080},[1059,6334,1022],{"class":5646},[1059,6336,3250],{"class":1080},[1059,6338,3253],{"class":1100},[1059,6340,3256],{"class":1080},[1059,6342,1022],{"class":5646},[1059,6344,3261],{"class":1080},[1059,6346,6348],{"class":1061,"line":6347},58,[1059,6349,3650],{"class":1100},[1059,6351,6353,6355,6357,6359,6361,6363,6366,6368],{"class":1061,"line":6352},59,[1059,6354,3291],{"class":1080},[1059,6356,3440],{"class":5646},[1059,6358,5832],{"class":5650},[1059,6360,1104],{"class":1080},[1059,6362,1230],{"class":1164},[1059,6364,6365],{"class":1168},"filters",[1059,6367,1230],{"class":1164},[1059,6369,3261],{"class":1080},[1059,6371,6373,6375,6377,6379,6382,6384,6386],{"class":1061,"line":6372},60,[1059,6374,3313],{"class":1080},[1059,6376,1035],{"class":5646},[1059,6378,3250],{"class":1080},[1059,6380,6381],{"class":1100},"Categories",[1059,6383,3256],{"class":1080},[1059,6385,1035],{"class":5646},[1059,6387,3261],{"class":1080},[1059,6389,6391,6393,6395],{"class":1061,"line":6390},61,[1059,6392,3313],{"class":1080},[1059,6394,5890],{"class":5646},[1059,6396,3261],{"class":1080},[1059,6398,6400,6402,6404,6406,6408,6410,6412,6414,6416,6418,6420,6423,6425,6427,6429,6431],{"class":1061,"line":6399},62,[1059,6401,3392],{"class":1080},[1059,6403,5910],{"class":5646},[1059,6405,5913],{"class":1080},[1059,6407,5850],{"class":5646},[1059,6409,5780],{"class":5650},[1059,6411,1104],{"class":1080},[1059,6413,1230],{"class":1164},[1059,6415,5924],{"class":1168},[1059,6417,1230],{"class":1164},[1059,6419,3250],{"class":1080},[1059,6421,6422],{"class":1100},"All",[1059,6424,3256],{"class":1080},[1059,6426,5850],{"class":5646},[1059,6428,5937],{"class":1080},[1059,6430,5910],{"class":5646},[1059,6432,3261],{"class":1080},[1059,6434,6436],{"class":1061,"line":6435},63,[1059,6437,6438],{"class":1100},"                {% for category in categories %}\n",[1059,6440,6442,6444,6446],{"class":1061,"line":6441},64,[1059,6443,5951],{"class":1080},[1059,6445,5910],{"class":5646},[1059,6447,3261],{"class":1080},[1059,6449,6451,6454,6456,6458,6460,6462,6465,6467],{"class":1061,"line":6450},65,[1059,6452,6453],{"class":1080},"                        \u003C",[1059,6455,5850],{"class":5646},[1059,6457,5780],{"class":5650},[1059,6459,1104],{"class":1080},[1059,6461,1230],{"class":1164},[1059,6463,6464],{"class":1168},"{% url 'category_products' category.slug %}",[1059,6466,1230],{"class":1164},[1059,6468,3261],{"class":1080},[1059,6470,6472],{"class":1061,"line":6471},66,[1059,6473,6474],{"class":1100},"                            {{ category.name }}\n",[1059,6476,6478,6481,6483],{"class":1061,"line":6477},67,[1059,6479,6480],{"class":1080},"                        \u003C/",[1059,6482,5850],{"class":5646},[1059,6484,3261],{"class":1080},[1059,6486,6488,6491,6493],{"class":1061,"line":6487},68,[1059,6489,6490],{"class":1080},"                    \u003C/",[1059,6492,5910],{"class":5646},[1059,6494,3261],{"class":1080},[1059,6496,6498],{"class":1061,"line":6497},69,[1059,6499,6500],{"class":1100},"                {% endfor %}\n",[1059,6502,6504,6506,6508],{"class":1061,"line":6503},70,[1059,6505,6070],{"class":1080},[1059,6507,5890],{"class":5646},[1059,6509,3261],{"class":1080},[1059,6511,6513,6515,6517],{"class":1061,"line":6512},71,[1059,6514,3437],{"class":1080},[1059,6516,3440],{"class":5646},[1059,6518,3261],{"class":1080},[1059,6520,6522],{"class":1061,"line":6521},72,[1059,6523,3650],{"class":1100},[1059,6525,6527,6529,6531,6533,6535,6537,6540,6542],{"class":1061,"line":6526},73,[1059,6528,3291],{"class":1080},[1059,6530,3440],{"class":5646},[1059,6532,5832],{"class":5650},[1059,6534,1104],{"class":1080},[1059,6536,1230],{"class":1164},[1059,6538,6539],{"class":1168},"products-grid",[1059,6541,1230],{"class":1164},[1059,6543,3261],{"class":1080},[1059,6545,6547],{"class":1061,"line":6546},74,[1059,6548,6549],{"class":1100},"            {% for product in products %}\n",[1059,6551,6553,6555,6557,6559,6561,6563,6565,6567],{"class":1061,"line":6552},75,[1059,6554,3392],{"class":1080},[1059,6556,3440],{"class":5646},[1059,6558,5832],{"class":5650},[1059,6560,1104],{"class":1080},[1059,6562,1230],{"class":1164},[1059,6564,3303],{"class":1168},[1059,6566,1230],{"class":1164},[1059,6568,3261],{"class":1080},[1059,6570,6572],{"class":1061,"line":6571},76,[1059,6573,6574],{"class":1100},"                    {% if product.image %}\n",[1059,6576,6578,6580,6583,6585,6587,6589,6592,6594,6597,6599,6601,6604,6606],{"class":1061,"line":6577},77,[1059,6579,6453],{"class":1080},[1059,6581,6582],{"class":5646},"img",[1059,6584,6236],{"class":5650},[1059,6586,1104],{"class":1080},[1059,6588,1230],{"class":1164},[1059,6590,6591],{"class":1168},"{{ product.image.url }}",[1059,6593,1230],{"class":1164},[1059,6595,6596],{"class":5650}," alt",[1059,6598,1104],{"class":1080},[1059,6600,1230],{"class":1164},[1059,6602,6603],{"class":1168},"{{ product.name }}",[1059,6605,1230],{"class":1164},[1059,6607,3261],{"class":1080},[1059,6609,6611],{"class":1061,"line":6610},78,[1059,6612,6613],{"class":1100},"                    {% endif %}\n",[1059,6615,6617,6619,6621],{"class":1061,"line":6616},79,[1059,6618,5951],{"class":1080},[1059,6620,1035],{"class":5646},[1059,6622,3261],{"class":1080},[1059,6624,6626,6628,6630,6632,6634,6636,6639,6641],{"class":1061,"line":6625},80,[1059,6627,6453],{"class":1080},[1059,6629,5850],{"class":5646},[1059,6631,5780],{"class":5650},[1059,6633,1104],{"class":1080},[1059,6635,1230],{"class":1164},[1059,6637,6638],{"class":1168},"{{ product.get_absolute_url }}",[1059,6640,1230],{"class":1164},[1059,6642,3261],{"class":1080},[1059,6644,6646],{"class":1061,"line":6645},81,[1059,6647,6648],{"class":1100},"                            {{ product.name }}\n",[1059,6650,6652,6654,6656],{"class":1061,"line":6651},82,[1059,6653,6480],{"class":1080},[1059,6655,5850],{"class":5646},[1059,6657,3261],{"class":1080},[1059,6659,6661,6663,6665],{"class":1061,"line":6660},83,[1059,6662,6490],{"class":1080},[1059,6664,1035],{"class":5646},[1059,6666,3261],{"class":1080},[1059,6668,6670,6672,6674,6676,6678,6680,6682,6684,6686,6689,6691,6693],{"class":1061,"line":6669},84,[1059,6671,5951],{"class":1080},[1059,6673,1026],{"class":5646},[1059,6675,5832],{"class":5650},[1059,6677,1104],{"class":1080},[1059,6679,1230],{"class":1164},[1059,6681,2747],{"class":1168},[1059,6683,1230],{"class":1164},[1059,6685,3250],{"class":1080},[1059,6687,6688],{"class":1100},"${{ product.price }}",[1059,6690,3256],{"class":1080},[1059,6692,1026],{"class":5646},[1059,6694,3261],{"class":1080},[1059,6696,6698,6700,6702,6704,6706,6708,6710,6712,6714,6717,6719,6721],{"class":1061,"line":6697},85,[1059,6699,5951],{"class":1080},[1059,6701,1026],{"class":5646},[1059,6703,5832],{"class":5650},[1059,6705,1104],{"class":1080},[1059,6707,1230],{"class":1164},[1059,6709,4858],{"class":1168},[1059,6711,1230],{"class":1164},[1059,6713,3250],{"class":1080},[1059,6715,6716],{"class":1100},"{{ product.get_condition_display }}",[1059,6718,3256],{"class":1080},[1059,6720,1026],{"class":5646},[1059,6722,3261],{"class":1080},[1059,6724,6726,6728,6730],{"class":1061,"line":6725},86,[1059,6727,6143],{"class":1080},[1059,6729,3440],{"class":5646},[1059,6731,3261],{"class":1080},[1059,6733,6735],{"class":1061,"line":6734},87,[1059,6736,6737],{"class":1100},"            {% empty %}\n",[1059,6739,6741,6743,6745,6747,6750,6752,6754],{"class":1061,"line":6740},88,[1059,6742,3392],{"class":1080},[1059,6744,1026],{"class":5646},[1059,6746,3250],{"class":1080},[1059,6748,6749],{"class":1100},"No products found.",[1059,6751,3256],{"class":1080},[1059,6753,1026],{"class":5646},[1059,6755,3261],{"class":1080},[1059,6757,6759],{"class":1061,"line":6758},89,[1059,6760,6152],{"class":1100},[1059,6762,6764,6766,6768],{"class":1061,"line":6763},90,[1059,6765,3437],{"class":1080},[1059,6767,3440],{"class":5646},[1059,6769,3261],{"class":1080},[1059,6771,6773],{"class":1061,"line":6772},91,[1059,6774,3650],{"class":1100},[1059,6776,6778],{"class":1061,"line":6777},92,[1059,6779,6780],{"class":1100},"        {% if is_paginated %}\n",[1059,6782,6784,6786,6788,6790,6792,6794,6797,6799],{"class":1061,"line":6783},93,[1059,6785,3313],{"class":1080},[1059,6787,3440],{"class":5646},[1059,6789,5832],{"class":5650},[1059,6791,1104],{"class":1080},[1059,6793,1230],{"class":1164},[1059,6795,6796],{"class":1168},"pagination",[1059,6798,1230],{"class":1164},[1059,6800,3261],{"class":1080},[1059,6802,6804,6806,6808,6810,6812,6814,6817,6819],{"class":1061,"line":6803},94,[1059,6805,3392],{"class":1080},[1059,6807,1059],{"class":5646},[1059,6809,5832],{"class":5650},[1059,6811,1104],{"class":1080},[1059,6813,1230],{"class":1164},[1059,6815,6816],{"class":1168},"page-links",[1059,6818,1230],{"class":1164},[1059,6820,3261],{"class":1080},[1059,6822,6824],{"class":1061,"line":6823},95,[1059,6825,6826],{"class":1100},"                    {% if page_obj.has_previous %}\n",[1059,6828,6830,6832,6834,6836,6838,6840,6843,6845,6847,6849,6852,6854,6857,6859,6861],{"class":1061,"line":6829},96,[1059,6831,6453],{"class":1080},[1059,6833,5850],{"class":5646},[1059,6835,5780],{"class":5650},[1059,6837,1104],{"class":1080},[1059,6839,1230],{"class":1164},[1059,6841,6842],{"class":1168},"?page=1",[1059,6844,1230],{"class":1164},[1059,6846,3250],{"class":1080},[1059,6848,6199],{"class":6198},[1059,6850,6851],{"class":1151},"laquo",[1059,6853,6205],{"class":6198},[1059,6855,6856],{"class":1100}," first",[1059,6858,3256],{"class":1080},[1059,6860,5850],{"class":5646},[1059,6862,3261],{"class":1080},[1059,6864,6866,6868,6870,6872,6874,6876,6879,6881,6883,6886,6888,6890],{"class":1061,"line":6865},97,[1059,6867,6453],{"class":1080},[1059,6869,5850],{"class":5646},[1059,6871,5780],{"class":5650},[1059,6873,1104],{"class":1080},[1059,6875,1230],{"class":1164},[1059,6877,6878],{"class":1168},"?page={{ page_obj.previous_page_number }}",[1059,6880,1230],{"class":1164},[1059,6882,3250],{"class":1080},[1059,6884,6885],{"class":1100},"previous",[1059,6887,3256],{"class":1080},[1059,6889,5850],{"class":5646},[1059,6891,3261],{"class":1080},[1059,6893,6895],{"class":1061,"line":6894},98,[1059,6896,6613],{"class":1100},[1059,6898,6900],{"class":1061,"line":6899},99,[1059,6901,6902],{"class":1100},"                    \n",[1059,6904,6906,6908,6910,6912,6914,6916,6919,6921],{"class":1061,"line":6905},100,[1059,6907,5951],{"class":1080},[1059,6909,1059],{"class":5646},[1059,6911,5832],{"class":5650},[1059,6913,1104],{"class":1080},[1059,6915,1230],{"class":1164},[1059,6917,6918],{"class":1168},"current",[1059,6920,1230],{"class":1164},[1059,6922,3261],{"class":1080},[1059,6924,6926],{"class":1061,"line":6925},101,[1059,6927,6928],{"class":1100},"                        Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}\n",[1059,6930,6932,6934,6936],{"class":1061,"line":6931},102,[1059,6933,6490],{"class":1080},[1059,6935,1059],{"class":5646},[1059,6937,3261],{"class":1080},[1059,6939,6941],{"class":1061,"line":6940},103,[1059,6942,6902],{"class":1100},[1059,6944,6946],{"class":1061,"line":6945},104,[1059,6947,6948],{"class":1100},"                    {% if page_obj.has_next %}\n",[1059,6950,6952,6954,6956,6958,6960,6962,6965,6967,6969,6972,6974,6976],{"class":1061,"line":6951},105,[1059,6953,6453],{"class":1080},[1059,6955,5850],{"class":5646},[1059,6957,5780],{"class":5650},[1059,6959,1104],{"class":1080},[1059,6961,1230],{"class":1164},[1059,6963,6964],{"class":1168},"?page={{ page_obj.next_page_number }}",[1059,6966,1230],{"class":1164},[1059,6968,3250],{"class":1080},[1059,6970,6971],{"class":1100},"next",[1059,6973,3256],{"class":1080},[1059,6975,5850],{"class":5646},[1059,6977,3261],{"class":1080},[1059,6979,6981,6983,6985,6987,6989,6991,6994,6996,6998,7001,7003,7006,7008,7010,7012],{"class":1061,"line":6980},106,[1059,6982,6453],{"class":1080},[1059,6984,5850],{"class":5646},[1059,6986,5780],{"class":5650},[1059,6988,1104],{"class":1080},[1059,6990,1230],{"class":1164},[1059,6992,6993],{"class":1168},"?page={{ page_obj.paginator.num_pages }}",[1059,6995,1230],{"class":1164},[1059,6997,3250],{"class":1080},[1059,6999,7000],{"class":1100},"last ",[1059,7002,6199],{"class":6198},[1059,7004,7005],{"class":1151},"raquo",[1059,7007,6205],{"class":6198},[1059,7009,3256],{"class":1080},[1059,7011,5850],{"class":5646},[1059,7013,3261],{"class":1080},[1059,7015,7017],{"class":1061,"line":7016},107,[1059,7018,6613],{"class":1100},[1059,7020,7022,7024,7026],{"class":1061,"line":7021},108,[1059,7023,6143],{"class":1080},[1059,7025,1059],{"class":5646},[1059,7027,3261],{"class":1080},[1059,7029,7031,7033,7035],{"class":1061,"line":7030},109,[1059,7032,6070],{"class":1080},[1059,7034,3440],{"class":5646},[1059,7036,3261],{"class":1080},[1059,7038,7040],{"class":1061,"line":7039},110,[1059,7041,6157],{"class":1100},[1059,7043,7045,7047,7049],{"class":1061,"line":7044},111,[1059,7046,6087],{"class":1080},[1059,7048,3440],{"class":5646},[1059,7050,3261],{"class":1080},[1059,7052,7054],{"class":1061,"line":7053},112,[1059,7055,7056],{"class":1100},"{% endblock %}\n",[1035,7058,7060],{"id":7059},"_4-urls-the-routing-layer","4. URLs: The Routing Layer",[1026,7062,7063],{},"URL patterns map requests to views:",[1049,7065,7067],{"className":1051,"code":7066,"language":1053,"meta":1054,"style":1054},"# project/urls.py\nfrom django.contrib import admin\nfrom django.urls import path, include\nfrom django.conf import settings\nfrom django.conf.urls.static import static\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('', include('products.urls')),\n    path('accounts/', include('django.contrib.auth.urls')),\n    path('api/', include('api.urls')),\n]\n\nif settings.DEBUG:\n    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)\n\n# products/urls.py\nfrom django.urls import path\nfrom . import views\n\napp_name = 'products'\n\nurlpatterns = [\n    path('', views.ProductListView.as_view(), name='product_list'),\n    path('search/', views.product_search, name='product_search'),\n    path('create/', views.ProductCreateView.as_view(), name='product_create'),\n    path('category/\u003Cslug:category_slug>/', views.ProductListView.as_view(), name='category_products'),\n    path('\u003Cslug:slug>/', views.ProductDetailView.as_view(), name='product_detail'),\n]\n",[1056,7068,7069,7074,7090,7110,7126,7152,7156,7164,7192,7218,7246,7274,7278,7282,7297,7334,7338,7343,7358,7371,7375,7388,7392,7400,7436,7472,7513,7553,7592],{"__ignoreMap":1054},[1059,7070,7071],{"class":1061,"line":1062},[1059,7072,7073],{"class":1065},"# project/urls.py\n",[1059,7075,7076,7078,7080,7082,7085,7087],{"class":1061,"line":1069},[1059,7077,1932],{"class":1180},[1059,7079,1935],{"class":1100},[1059,7081,1088],{"class":1080},[1059,7083,7084],{"class":1100},"contrib ",[1059,7086,1952],{"class":1180},[1059,7088,7089],{"class":1100}," admin\n",[1059,7091,7092,7094,7096,7098,7100,7102,7105,7107],{"class":1061,"line":1097},[1059,7093,1932],{"class":1180},[1059,7095,1935],{"class":1100},[1059,7097,1088],{"class":1080},[1059,7099,4069],{"class":1100},[1059,7101,1952],{"class":1180},[1059,7103,7104],{"class":1100}," path",[1059,7106,1524],{"class":1080},[1059,7108,7109],{"class":1100}," include\n",[1059,7111,7112,7114,7116,7118,7121,7123],{"class":1061,"line":1119},[1059,7113,1932],{"class":1180},[1059,7115,1935],{"class":1100},[1059,7117,1088],{"class":1080},[1059,7119,7120],{"class":1100},"conf ",[1059,7122,1952],{"class":1180},[1059,7124,7125],{"class":1100}," settings\n",[1059,7127,7128,7130,7132,7134,7137,7139,7142,7144,7147,7149],{"class":1061,"line":1125},[1059,7129,1932],{"class":1180},[1059,7131,1935],{"class":1100},[1059,7133,1088],{"class":1080},[1059,7135,7136],{"class":1100},"conf",[1059,7138,1088],{"class":1080},[1059,7140,7141],{"class":1100},"urls",[1059,7143,1088],{"class":1080},[1059,7145,7146],{"class":1100},"static ",[1059,7148,1952],{"class":1180},[1059,7150,7151],{"class":1100}," static\n",[1059,7153,7154],{"class":1061,"line":1143},[1059,7155,1254],{"emptyLinePlaceholder":1253},[1059,7157,7158,7160,7162],{"class":1061,"line":1177},[1059,7159,1615],{"class":1100},[1059,7161,1104],{"class":1080},[1059,7163,1620],{"class":1080},[1059,7165,7166,7168,7170,7172,7175,7177,7179,7182,7184,7186,7188,7190],{"class":1061,"line":1215},[1059,7167,1625],{"class":1112},[1059,7169,1081],{"class":1080},[1059,7171,1165],{"class":1164},[1059,7173,7174],{"class":1168},"admin/",[1059,7176,1165],{"class":1164},[1059,7178,1524],{"class":1080},[1059,7180,7181],{"class":1112}," admin",[1059,7183,1088],{"class":1080},[1059,7185,2478],{"class":1157},[1059,7187,1088],{"class":1080},[1059,7189,7141],{"class":1157},[1059,7191,1647],{"class":1080},[1059,7193,7194,7196,7198,7201,7203,7206,7208,7210,7213,7215],{"class":1061,"line":1241},[1059,7195,1625],{"class":1112},[1059,7197,1081],{"class":1080},[1059,7199,7200],{"class":1164},"''",[1059,7202,1524],{"class":1080},[1059,7204,7205],{"class":1112}," include",[1059,7207,1081],{"class":1080},[1059,7209,1165],{"class":1164},[1059,7211,7212],{"class":1168},"products.urls",[1059,7214,1165],{"class":1164},[1059,7216,7217],{"class":1080},")),\n",[1059,7219,7220,7222,7224,7226,7229,7231,7233,7235,7237,7239,7242,7244],{"class":1061,"line":1250},[1059,7221,1625],{"class":1112},[1059,7223,1081],{"class":1080},[1059,7225,1165],{"class":1164},[1059,7227,7228],{"class":1168},"accounts/",[1059,7230,1165],{"class":1164},[1059,7232,1524],{"class":1080},[1059,7234,7205],{"class":1112},[1059,7236,1081],{"class":1080},[1059,7238,1165],{"class":1164},[1059,7240,7241],{"class":1168},"django.contrib.auth.urls",[1059,7243,1165],{"class":1164},[1059,7245,7217],{"class":1080},[1059,7247,7248,7250,7252,7254,7257,7259,7261,7263,7265,7267,7270,7272],{"class":1061,"line":1257},[1059,7249,1625],{"class":1112},[1059,7251,1081],{"class":1080},[1059,7253,1165],{"class":1164},[1059,7255,7256],{"class":1168},"api/",[1059,7258,1165],{"class":1164},[1059,7260,1524],{"class":1080},[1059,7262,7205],{"class":1112},[1059,7264,1081],{"class":1080},[1059,7266,1165],{"class":1164},[1059,7268,7269],{"class":1168},"api.urls",[1059,7271,1165],{"class":1164},[1059,7273,7217],{"class":1080},[1059,7275,7276],{"class":1061,"line":1275},[1059,7277,1174],{"class":1080},[1059,7279,7280],{"class":1061,"line":1290},[1059,7281,1254],{"emptyLinePlaceholder":1253},[1059,7283,7284,7287,7290,7292,7295],{"class":1061,"line":1295},[1059,7285,7286],{"class":1180},"if",[1059,7288,7289],{"class":1100}," settings",[1059,7291,1088],{"class":1080},[1059,7293,7294],{"class":1745},"DEBUG",[1059,7296,1411],{"class":1080},[1059,7298,7299,7302,7305,7308,7310,7313,7315,7318,7320,7323,7325,7327,7329,7332],{"class":1061,"line":1308},[1059,7300,7301],{"class":1100},"    urlpatterns ",[1059,7303,7304],{"class":1080},"+=",[1059,7306,7307],{"class":1112}," static",[1059,7309,1081],{"class":1080},[1059,7311,7312],{"class":1112},"settings",[1059,7314,1088],{"class":1080},[1059,7316,7317],{"class":1745},"MEDIA_URL",[1059,7319,1524],{"class":1080},[1059,7321,7322],{"class":1199}," document_root",[1059,7324,1104],{"class":1080},[1059,7326,7312],{"class":1112},[1059,7328,1088],{"class":1080},[1059,7330,7331],{"class":1745},"MEDIA_ROOT",[1059,7333,1238],{"class":1080},[1059,7335,7336],{"class":1061,"line":1331},[1059,7337,1254],{"emptyLinePlaceholder":1253},[1059,7339,7340],{"class":1061,"line":1364},[1059,7341,7342],{"class":1065},"# products/urls.py\n",[1059,7344,7345,7347,7349,7351,7353,7355],{"class":1061,"line":1385},[1059,7346,1932],{"class":1180},[1059,7348,1935],{"class":1100},[1059,7350,1088],{"class":1080},[1059,7352,4069],{"class":1100},[1059,7354,1952],{"class":1180},[1059,7356,7357],{"class":1100}," path\n",[1059,7359,7360,7362,7365,7368],{"class":1061,"line":1392},[1059,7361,1932],{"class":1180},[1059,7363,7364],{"class":1080}," .",[1059,7366,7367],{"class":1180}," import",[1059,7369,7370],{"class":1100}," views\n",[1059,7372,7373],{"class":1061,"line":1397},[1059,7374,1254],{"emptyLinePlaceholder":1253},[1059,7376,7377,7380,7382,7384,7386],{"class":1061,"line":1403},[1059,7378,7379],{"class":1100},"app_name ",[1059,7381,1104],{"class":1080},[1059,7383,2533],{"class":1164},[1059,7385,2929],{"class":1168},[1059,7387,2539],{"class":1164},[1059,7389,7390],{"class":1061,"line":1414},[1059,7391,1254],{"emptyLinePlaceholder":1253},[1059,7393,7394,7396,7398],{"class":1061,"line":1427},[1059,7395,1615],{"class":1100},[1059,7397,1104],{"class":1080},[1059,7399,1620],{"class":1080},[1059,7401,7402,7404,7406,7408,7410,7412,7414,7417,7419,7421,7423,7425,7427,7429,7432,7434],{"class":1061,"line":1450},[1059,7403,1625],{"class":1112},[1059,7405,1081],{"class":1080},[1059,7407,7200],{"class":1164},[1059,7409,1524],{"class":1080},[1059,7411,1639],{"class":1112},[1059,7413,1088],{"class":1080},[1059,7415,7416],{"class":1157},"ProductListView",[1059,7418,1088],{"class":1080},[1059,7420,3527],{"class":1112},[1059,7422,3530],{"class":1080},[1059,7424,3533],{"class":1199},[1059,7426,1104],{"class":1080},[1059,7428,1165],{"class":1164},[1059,7430,7431],{"class":1168},"product_list",[1059,7433,1165],{"class":1164},[1059,7435,1647],{"class":1080},[1059,7437,7438,7440,7442,7444,7447,7449,7451,7453,7455,7458,7460,7462,7464,7466,7468,7470],{"class":1061,"line":1479},[1059,7439,1625],{"class":1112},[1059,7441,1081],{"class":1080},[1059,7443,1165],{"class":1164},[1059,7445,7446],{"class":1168},"search/",[1059,7448,1165],{"class":1164},[1059,7450,1524],{"class":1080},[1059,7452,1639],{"class":1112},[1059,7454,1088],{"class":1080},[1059,7456,7457],{"class":1157},"product_search",[1059,7459,1524],{"class":1080},[1059,7461,3533],{"class":1199},[1059,7463,1104],{"class":1080},[1059,7465,1165],{"class":1164},[1059,7467,7457],{"class":1168},[1059,7469,1165],{"class":1164},[1059,7471,1647],{"class":1080},[1059,7473,7474,7476,7478,7480,7483,7485,7487,7489,7491,7494,7496,7498,7500,7502,7504,7506,7509,7511],{"class":1061,"line":1500},[1059,7475,1625],{"class":1112},[1059,7477,1081],{"class":1080},[1059,7479,1165],{"class":1164},[1059,7481,7482],{"class":1168},"create/",[1059,7484,1165],{"class":1164},[1059,7486,1524],{"class":1080},[1059,7488,1639],{"class":1112},[1059,7490,1088],{"class":1080},[1059,7492,7493],{"class":1157},"ProductCreateView",[1059,7495,1088],{"class":1080},[1059,7497,3527],{"class":1112},[1059,7499,3530],{"class":1080},[1059,7501,3533],{"class":1199},[1059,7503,1104],{"class":1080},[1059,7505,1165],{"class":1164},[1059,7507,7508],{"class":1168},"product_create",[1059,7510,1165],{"class":1164},[1059,7512,1647],{"class":1080},[1059,7514,7515,7517,7519,7521,7524,7526,7528,7530,7532,7534,7536,7538,7540,7542,7544,7546,7549,7551],{"class":1061,"line":1507},[1059,7516,1625],{"class":1112},[1059,7518,1081],{"class":1080},[1059,7520,1165],{"class":1164},[1059,7522,7523],{"class":1168},"category/\u003Cslug:category_slug>/",[1059,7525,1165],{"class":1164},[1059,7527,1524],{"class":1080},[1059,7529,1639],{"class":1112},[1059,7531,1088],{"class":1080},[1059,7533,7416],{"class":1157},[1059,7535,1088],{"class":1080},[1059,7537,3527],{"class":1112},[1059,7539,3530],{"class":1080},[1059,7541,3533],{"class":1199},[1059,7543,1104],{"class":1080},[1059,7545,1165],{"class":1164},[1059,7547,7548],{"class":1168},"category_products",[1059,7550,1165],{"class":1164},[1059,7552,1647],{"class":1080},[1059,7554,7555,7557,7559,7561,7564,7566,7568,7570,7572,7574,7576,7578,7580,7582,7584,7586,7588,7590],{"class":1061,"line":1512},[1059,7556,1625],{"class":1112},[1059,7558,1081],{"class":1080},[1059,7560,1165],{"class":1164},[1059,7562,7563],{"class":1168},"\u003Cslug:slug>/",[1059,7565,1165],{"class":1164},[1059,7567,1524],{"class":1080},[1059,7569,1639],{"class":1112},[1059,7571,1088],{"class":1080},[1059,7573,3522],{"class":1157},[1059,7575,1088],{"class":1080},[1059,7577,3527],{"class":1112},[1059,7579,3530],{"class":1080},[1059,7581,3533],{"class":1199},[1059,7583,1104],{"class":1080},[1059,7585,1165],{"class":1164},[1059,7587,3540],{"class":1168},[1059,7589,1165],{"class":1164},[1059,7591,1647],{"class":1080},[1059,7593,7594],{"class":1061,"line":1535},[1059,7595,1174],{"class":1080},[1030,7597,7599],{"id":7598},"design-patterns-in-django","Design Patterns in Django",[1035,7601,7603],{"id":7602},"_1-fat-models-thin-views","1. Fat Models, Thin Views",[1026,7605,7606],{},"Keep business logic in models, not views:",[1049,7608,7610],{"className":1051,"code":7609,"language":1053,"meta":1054,"style":1054},"# Good: Business logic in model\nclass Order(models.Model):\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    total = models.DecimalField(max_digits=10, decimal_places=2)\n    status = models.CharField(max_length=20, default='pending')\n    \n    def calculate_total(self):\n        \"\"\"Business logic in model\"\"\"\n        return sum(item.subtotal for item in self.items.all())\n    \n    def can_be_cancelled(self):\n        \"\"\"Business logic in model\"\"\"\n        return self.status in ['pending', 'confirmed']\n    \n    def cancel(self):\n        \"\"\"Business logic in model\"\"\"\n        if self.can_be_cancelled():\n            self.status = 'cancelled'\n            self.save()\n            return True\n        return False\n\n# Thin view\ndef cancel_order(request, order_id):\n    order = get_object_or_404(Order, id=order_id, user=request.user)\n    \n    if order.cancel():  # Business logic delegated to model\n        messages.success(request, 'Order cancelled successfully.')\n    else:\n        messages.error(request, 'Order cannot be cancelled.')\n    \n    return redirect('order_detail', order_id=order.id)\n",[1056,7611,7612,7617,7634,7665,7696,7733,7737,7750,7759,7797,7801,7814,7822,7855,7859,7872,7880,7893,7911,7922,7930,7937,7941,7946,7964,8001,8005,8022,8047,8054,8078,8082],{"__ignoreMap":1054},[1059,7613,7614],{"class":1061,"line":1062},[1059,7615,7616],{"class":1065},"# Good: Business logic in model\n",[1059,7618,7619,7621,7624,7626,7628,7630,7632],{"class":1061,"line":1069},[1059,7620,1073],{"class":1072},[1059,7622,7623],{"class":1076}," Order",[1059,7625,1081],{"class":1080},[1059,7627,1696],{"class":1084},[1059,7629,1088],{"class":1080},[1059,7631,1701],{"class":1084},[1059,7633,1094],{"class":1080},[1059,7635,7636,7639,7641,7643,7645,7647,7649,7651,7653,7655,7657,7659,7661,7663],{"class":1061,"line":1097},[1059,7637,7638],{"class":1100},"    user ",[1059,7640,1104],{"class":1080},[1059,7642,1713],{"class":1100},[1059,7644,1088],{"class":1080},[1059,7646,1718],{"class":1112},[1059,7648,1081],{"class":1080},[1059,7650,1998],{"class":1112},[1059,7652,1524],{"class":1080},[1059,7654,2363],{"class":1199},[1059,7656,1104],{"class":1080},[1059,7658,1696],{"class":1112},[1059,7660,1088],{"class":1080},[1059,7662,1746],{"class":1745},[1059,7664,1238],{"class":1080},[1059,7666,7667,7670,7672,7674,7676,7678,7680,7682,7684,7686,7688,7690,7692,7694],{"class":1061,"line":1119},[1059,7668,7669],{"class":1100},"    total ",[1059,7671,1104],{"class":1080},[1059,7673,1713],{"class":1100},[1059,7675,1088],{"class":1080},[1059,7677,2639],{"class":1112},[1059,7679,1081],{"class":1080},[1059,7681,2644],{"class":1199},[1059,7683,1104],{"class":1080},[1059,7685,2649],{"class":2323},[1059,7687,1524],{"class":1080},[1059,7689,2654],{"class":1199},[1059,7691,1104],{"class":1080},[1059,7693,2659],{"class":2323},[1059,7695,1238],{"class":1080},[1059,7697,7698,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7722,7724,7726,7729,7731],{"class":1061,"line":1125},[1059,7699,7700],{"class":1100},"    status ",[1059,7702,1104],{"class":1080},[1059,7704,1713],{"class":1100},[1059,7706,1088],{"class":1080},[1059,7708,2313],{"class":1112},[1059,7710,1081],{"class":1080},[1059,7712,2318],{"class":1199},[1059,7714,1104],{"class":1080},[1059,7716,4533],{"class":2323},[1059,7718,1524],{"class":1080},[1059,7720,7721],{"class":1199}," default",[1059,7723,1104],{"class":1080},[1059,7725,1165],{"class":1164},[1059,7727,7728],{"class":1168},"pending",[1059,7730,1165],{"class":1164},[1059,7732,1238],{"class":1080},[1059,7734,7735],{"class":1061,"line":1143},[1059,7736,1122],{"class":1100},[1059,7738,7739,7741,7744,7746,7748],{"class":1061,"line":1177},[1059,7740,1128],{"class":1072},[1059,7742,7743],{"class":1131}," calculate_total",[1059,7745,1081],{"class":1080},[1059,7747,1138],{"class":1137},[1059,7749,1094],{"class":1080},[1059,7751,7752,7754,7757],{"class":1061,"line":1215},[1059,7753,2729],{"class":2728},[1059,7755,7756],{"class":2732},"Business logic in model",[1059,7758,2736],{"class":2728},[1059,7760,7761,7763,7766,7768,7771,7773,7776,7778,7781,7783,7785,7787,7790,7792,7794],{"class":1061,"line":1241},[1059,7762,1244],{"class":1180},[1059,7764,7765],{"class":2182}," sum",[1059,7767,1081],{"class":1080},[1059,7769,7770],{"class":1112},"item",[1059,7772,1088],{"class":1080},[1059,7774,7775],{"class":1157},"subtotal",[1059,7777,3272],{"class":1180},[1059,7779,7780],{"class":1112}," item ",[1059,7782,3278],{"class":1180},[1059,7784,1152],{"class":1151},[1059,7786,1088],{"class":1080},[1059,7788,7789],{"class":1157},"items",[1059,7791,1088],{"class":1080},[1059,7793,5441],{"class":1112},[1059,7795,7796],{"class":1080},"())\n",[1059,7798,7799],{"class":1061,"line":1250},[1059,7800,1122],{"class":1100},[1059,7802,7803,7805,7808,7810,7812],{"class":1061,"line":1257},[1059,7804,1128],{"class":1072},[1059,7806,7807],{"class":1131}," can_be_cancelled",[1059,7809,1081],{"class":1080},[1059,7811,1138],{"class":1137},[1059,7813,1094],{"class":1080},[1059,7815,7816,7818,7820],{"class":1061,"line":1275},[1059,7817,2729],{"class":2728},[1059,7819,7756],{"class":2732},[1059,7821,2736],{"class":2728},[1059,7823,7824,7826,7828,7830,7833,7836,7838,7840,7842,7844,7846,7848,7851,7853],{"class":1061,"line":1290},[1059,7825,1244],{"class":1180},[1059,7827,1152],{"class":1151},[1059,7829,1088],{"class":1080},[1059,7831,7832],{"class":1157},"status",[1059,7834,7835],{"class":1863}," in",[1059,7837,2450],{"class":1080},[1059,7839,1165],{"class":1164},[1059,7841,7728],{"class":1168},[1059,7843,1165],{"class":1164},[1059,7845,1524],{"class":1080},[1059,7847,2533],{"class":1164},[1059,7849,7850],{"class":1168},"confirmed",[1059,7852,1165],{"class":1164},[1059,7854,1174],{"class":1080},[1059,7856,7857],{"class":1061,"line":1295},[1059,7858,1122],{"class":1100},[1059,7860,7861,7863,7866,7868,7870],{"class":1061,"line":1308},[1059,7862,1128],{"class":1072},[1059,7864,7865],{"class":1131}," cancel",[1059,7867,1081],{"class":1080},[1059,7869,1138],{"class":1137},[1059,7871,1094],{"class":1080},[1059,7873,7874,7876,7878],{"class":1061,"line":1331},[1059,7875,2729],{"class":2728},[1059,7877,7756],{"class":2732},[1059,7879,2736],{"class":2728},[1059,7881,7882,7884,7886,7888,7891],{"class":1061,"line":1364},[1059,7883,1181],{"class":1180},[1059,7885,1152],{"class":1151},[1059,7887,1088],{"class":1080},[1059,7889,7890],{"class":1112},"can_be_cancelled",[1059,7892,1212],{"class":1080},[1059,7894,7895,7898,7900,7902,7904,7906,7909],{"class":1061,"line":1385},[1059,7896,7897],{"class":1151},"            self",[1059,7899,1088],{"class":1080},[1059,7901,7832],{"class":1157},[1059,7903,2207],{"class":1080},[1059,7905,2533],{"class":1164},[1059,7907,7908],{"class":1168},"cancelled",[1059,7910,2539],{"class":1164},[1059,7912,7913,7915,7917,7920],{"class":1061,"line":1392},[1059,7914,7897],{"class":1151},[1059,7916,1088],{"class":1080},[1059,7918,7919],{"class":1112},"save",[1059,7921,1116],{"class":1080},[1059,7923,7924,7927],{"class":1061,"line":1397},[1059,7925,7926],{"class":1180},"            return",[1059,7928,7929],{"class":1829}," True\n",[1059,7931,7932,7934],{"class":1061,"line":1403},[1059,7933,1244],{"class":1180},[1059,7935,7936],{"class":1829}," False\n",[1059,7938,7939],{"class":1061,"line":1414},[1059,7940,1254],{"emptyLinePlaceholder":1253},[1059,7942,7943],{"class":1061,"line":1427},[1059,7944,7945],{"class":1065},"# Thin view\n",[1059,7947,7948,7950,7953,7955,7957,7959,7962],{"class":1061,"line":1450},[1059,7949,2005],{"class":1072},[1059,7951,7952],{"class":1131}," cancel_order",[1059,7954,1081],{"class":1080},[1059,7956,2874],{"class":2013},[1059,7958,1524],{"class":1080},[1059,7960,7961],{"class":2013}," order_id",[1059,7963,1094],{"class":1080},[1059,7965,7966,7969,7971,7973,7975,7978,7980,7982,7984,7987,7989,7991,7993,7995,7997,7999],{"class":1061,"line":1479},[1059,7967,7968],{"class":1100},"    order ",[1059,7970,1104],{"class":1080},[1059,7972,3072],{"class":1112},[1059,7974,1081],{"class":1080},[1059,7976,7977],{"class":1112},"Order",[1059,7979,1524],{"class":1080},[1059,7981,3082],{"class":1199},[1059,7983,1104],{"class":1080},[1059,7985,7986],{"class":1112},"order_id",[1059,7988,1524],{"class":1080},[1059,7990,2103],{"class":1199},[1059,7992,1104],{"class":1080},[1059,7994,2874],{"class":1112},[1059,7996,1088],{"class":1080},[1059,7998,2062],{"class":1157},[1059,8000,1238],{"class":1080},[1059,8002,8003],{"class":1061,"line":1500},[1059,8004,1122],{"class":1100},[1059,8006,8007,8009,8012,8014,8017,8019],{"class":1061,"line":1507},[1059,8008,2039],{"class":1180},[1059,8010,8011],{"class":1100}," order",[1059,8013,1088],{"class":1080},[1059,8015,8016],{"class":1112},"cancel",[1059,8018,1358],{"class":1080},[1059,8020,8021],{"class":1065},"  # Business logic delegated to model\n",[1059,8023,8024,8027,8029,8032,8034,8036,8038,8040,8043,8045],{"class":1061,"line":1512},[1059,8025,8026],{"class":1100},"        messages",[1059,8028,1088],{"class":1080},[1059,8030,8031],{"class":1112},"success",[1059,8033,1081],{"class":1080},[1059,8035,2874],{"class":1112},[1059,8037,1524],{"class":1080},[1059,8039,2533],{"class":1164},[1059,8041,8042],{"class":1168},"Order cancelled successfully.",[1059,8044,1165],{"class":1164},[1059,8046,1238],{"class":1080},[1059,8048,8049,8052],{"class":1061,"line":1535},[1059,8050,8051],{"class":1180},"    else",[1059,8053,1411],{"class":1080},[1059,8055,8056,8058,8060,8063,8065,8067,8069,8071,8074,8076],{"class":1061,"line":1550},[1059,8057,8026],{"class":1100},[1059,8059,1088],{"class":1080},[1059,8061,8062],{"class":1112},"error",[1059,8064,1081],{"class":1080},[1059,8066,2874],{"class":1112},[1059,8068,1524],{"class":1080},[1059,8070,2533],{"class":1164},[1059,8072,8073],{"class":1168},"Order cannot be cancelled.",[1059,8075,1165],{"class":1164},[1059,8077,1238],{"class":1080},[1059,8079,8080],{"class":1061,"line":1555},[1059,8081,1122],{"class":1100},[1059,8083,8084,8086,8089,8091,8093,8096,8098,8100,8102,8104,8107,8109,8112],{"class":1061,"line":1576},[1059,8085,2945],{"class":1180},[1059,8087,8088],{"class":1112}," redirect",[1059,8090,1081],{"class":1080},[1059,8092,1165],{"class":1164},[1059,8094,8095],{"class":1168},"order_detail",[1059,8097,1165],{"class":1164},[1059,8099,1524],{"class":1080},[1059,8101,7961],{"class":1199},[1059,8103,1104],{"class":1080},[1059,8105,8106],{"class":1112},"order",[1059,8108,1088],{"class":1080},[1059,8110,8111],{"class":1157},"id",[1059,8113,1238],{"class":1080},[1035,8115,8117],{"id":8116},"_2-manager-and-queryset-patterns","2. Manager and QuerySet Patterns",[1026,8119,8120],{},"Encapsulate common queries:",[1049,8122,8124],{"className":1051,"code":8123,"language":1053,"meta":1054,"style":1054},"class PublishedManager(models.Manager):\n    def get_queryset(self):\n        return super().get_queryset().filter(status='published')\n\nclass PostQuerySet(models.QuerySet):\n    def published(self):\n        return self.filter(status='published')\n    \n    def by_author(self, author):\n        return self.filter(author=author)\n    \n    def recent(self, days=7):\n        return self.filter(\n            created_at__gte=timezone.now() - timedelta(days=days)\n        )\n\nclass Post(models.Model):\n    title = models.CharField(max_length=200)\n    content = models.TextField()\n    author = models.ForeignKey(User, on_delete=models.CASCADE)\n    status = models.CharField(max_length=20, default='draft')\n    created_at = models.DateTimeField(auto_now_add=True)\n    \n    objects = models.Manager()  # Default manager\n    published = PublishedManager()  # Custom manager\n    \n    # Custom QuerySet\n    objects = PostQuerySet.as_manager()\n\n# Usage\nrecent_published_posts = Post.objects.published().recent(days=30)\nauthor_posts = Post.objects.by_author(user).published()\n",[1056,8125,8126,8144,8156,8186,8190,8208,8221,8245,8249,8267,8288,8292,8315,8327,8361,8366,8370,8387,8409,8423,8453,8488,8510,8514,8532,8546,8550,8555,8570,8574,8579,8612],{"__ignoreMap":1054},[1059,8127,8128,8130,8133,8135,8137,8139,8142],{"class":1061,"line":1062},[1059,8129,1073],{"class":1072},[1059,8131,8132],{"class":1076}," PublishedManager",[1059,8134,1081],{"class":1080},[1059,8136,1696],{"class":1084},[1059,8138,1088],{"class":1080},[1059,8140,8141],{"class":1084},"Manager",[1059,8143,1094],{"class":1080},[1059,8145,8146,8148,8150,8152,8154],{"class":1061,"line":1069},[1059,8147,1128],{"class":1072},[1059,8149,5262],{"class":1131},[1059,8151,1081],{"class":1080},[1059,8153,1138],{"class":1137},[1059,8155,1094],{"class":1080},[1059,8157,8158,8160,8162,8164,8167,8169,8171,8173,8175,8177,8179,8182,8184],{"class":1061,"line":1097},[1059,8159,1244],{"class":1180},[1059,8161,3773],{"class":2782},[1059,8163,3776],{"class":1080},[1059,8165,8166],{"class":1112},"get_queryset",[1059,8168,3776],{"class":1080},[1059,8170,1194],{"class":1112},[1059,8172,1081],{"class":1080},[1059,8174,7832],{"class":1199},[1059,8176,1104],{"class":1080},[1059,8178,1165],{"class":1164},[1059,8180,8181],{"class":1168},"published",[1059,8183,1165],{"class":1164},[1059,8185,1238],{"class":1080},[1059,8187,8188],{"class":1061,"line":1119},[1059,8189,1254],{"emptyLinePlaceholder":1253},[1059,8191,8192,8194,8197,8199,8201,8203,8206],{"class":1061,"line":1125},[1059,8193,1073],{"class":1072},[1059,8195,8196],{"class":1076}," PostQuerySet",[1059,8198,1081],{"class":1080},[1059,8200,1696],{"class":1084},[1059,8202,1088],{"class":1080},[1059,8204,8205],{"class":1084},"QuerySet",[1059,8207,1094],{"class":1080},[1059,8209,8210,8212,8215,8217,8219],{"class":1061,"line":1143},[1059,8211,1128],{"class":1072},[1059,8213,8214],{"class":1131}," published",[1059,8216,1081],{"class":1080},[1059,8218,1138],{"class":1137},[1059,8220,1094],{"class":1080},[1059,8222,8223,8225,8227,8229,8231,8233,8235,8237,8239,8241,8243],{"class":1061,"line":1177},[1059,8224,1244],{"class":1180},[1059,8226,1152],{"class":1151},[1059,8228,1088],{"class":1080},[1059,8230,1194],{"class":1112},[1059,8232,1081],{"class":1080},[1059,8234,7832],{"class":1199},[1059,8236,1104],{"class":1080},[1059,8238,1165],{"class":1164},[1059,8240,8181],{"class":1168},[1059,8242,1165],{"class":1164},[1059,8244,1238],{"class":1080},[1059,8246,8247],{"class":1061,"line":1215},[1059,8248,1122],{"class":1100},[1059,8250,8251,8253,8256,8258,8260,8262,8265],{"class":1061,"line":1241},[1059,8252,1128],{"class":1072},[1059,8254,8255],{"class":1131}," by_author",[1059,8257,1081],{"class":1080},[1059,8259,1138],{"class":1137},[1059,8261,1524],{"class":1080},[1059,8263,8264],{"class":2013}," author",[1059,8266,1094],{"class":1080},[1059,8268,8269,8271,8273,8275,8277,8279,8282,8284,8286],{"class":1061,"line":1250},[1059,8270,1244],{"class":1180},[1059,8272,1152],{"class":1151},[1059,8274,1088],{"class":1080},[1059,8276,1194],{"class":1112},[1059,8278,1081],{"class":1080},[1059,8280,8281],{"class":1199},"author",[1059,8283,1104],{"class":1080},[1059,8285,8281],{"class":1112},[1059,8287,1238],{"class":1080},[1059,8289,8290],{"class":1061,"line":1257},[1059,8291,1122],{"class":1100},[1059,8293,8294,8296,8299,8301,8303,8305,8308,8310,8313],{"class":1061,"line":1275},[1059,8295,1128],{"class":1072},[1059,8297,8298],{"class":1131}," recent",[1059,8300,1081],{"class":1080},[1059,8302,1138],{"class":1137},[1059,8304,1524],{"class":1080},[1059,8306,8307],{"class":2013}," days",[1059,8309,1104],{"class":1863},[1059,8311,8312],{"class":2323},"7",[1059,8314,1094],{"class":1080},[1059,8316,8317,8319,8321,8323,8325],{"class":1061,"line":1290},[1059,8318,1244],{"class":1180},[1059,8320,1152],{"class":1151},[1059,8322,1088],{"class":1080},[1059,8324,1194],{"class":1112},[1059,8326,1721],{"class":1080},[1059,8328,8329,8332,8334,8337,8339,8342,8345,8347,8350,8352,8355,8357,8359],{"class":1061,"line":1295},[1059,8330,8331],{"class":1199},"            created_at__gte",[1059,8333,1104],{"class":1080},[1059,8335,8336],{"class":1112},"timezone",[1059,8338,1088],{"class":1080},[1059,8340,8341],{"class":1112},"now",[1059,8343,8344],{"class":1080},"()",[1059,8346,2759],{"class":1863},[1059,8348,8349],{"class":1112}," timedelta",[1059,8351,1081],{"class":1080},[1059,8353,8354],{"class":1199},"days",[1059,8356,1104],{"class":1080},[1059,8358,8354],{"class":1112},[1059,8360,1238],{"class":1080},[1059,8362,8363],{"class":1061,"line":1308},[1059,8364,8365],{"class":1080},"        )\n",[1059,8367,8368],{"class":1061,"line":1331},[1059,8369,1254],{"emptyLinePlaceholder":1253},[1059,8371,8372,8374,8377,8379,8381,8383,8385],{"class":1061,"line":1364},[1059,8373,1073],{"class":1072},[1059,8375,8376],{"class":1076}," Post",[1059,8378,1081],{"class":1080},[1059,8380,1696],{"class":1084},[1059,8382,1088],{"class":1080},[1059,8384,1701],{"class":1084},[1059,8386,1094],{"class":1080},[1059,8388,8389,8391,8393,8395,8397,8399,8401,8403,8405,8407],{"class":1061,"line":1385},[1059,8390,2304],{"class":1100},[1059,8392,1104],{"class":1080},[1059,8394,1713],{"class":1100},[1059,8396,1088],{"class":1080},[1059,8398,2313],{"class":1112},[1059,8400,1081],{"class":1080},[1059,8402,2318],{"class":1199},[1059,8404,1104],{"class":1080},[1059,8406,2324],{"class":2323},[1059,8408,1238],{"class":1080},[1059,8410,8411,8413,8415,8417,8419,8421],{"class":1061,"line":1392},[1059,8412,2331],{"class":1100},[1059,8414,1104],{"class":1080},[1059,8416,1713],{"class":1100},[1059,8418,1088],{"class":1080},[1059,8420,2340],{"class":1112},[1059,8422,1116],{"class":1080},[1059,8424,8425,8427,8429,8431,8433,8435,8437,8439,8441,8443,8445,8447,8449,8451],{"class":1061,"line":1397},[1059,8426,1708],{"class":1100},[1059,8428,1104],{"class":1080},[1059,8430,1713],{"class":1100},[1059,8432,1088],{"class":1080},[1059,8434,1718],{"class":1112},[1059,8436,1081],{"class":1080},[1059,8438,1998],{"class":1112},[1059,8440,1524],{"class":1080},[1059,8442,2363],{"class":1199},[1059,8444,1104],{"class":1080},[1059,8446,1696],{"class":1112},[1059,8448,1088],{"class":1080},[1059,8450,1746],{"class":1745},[1059,8452,1238],{"class":1080},[1059,8454,8455,8457,8459,8461,8463,8465,8467,8469,8471,8473,8475,8477,8479,8481,8484,8486],{"class":1061,"line":1403},[1059,8456,7700],{"class":1100},[1059,8458,1104],{"class":1080},[1059,8460,1713],{"class":1100},[1059,8462,1088],{"class":1080},[1059,8464,2313],{"class":1112},[1059,8466,1081],{"class":1080},[1059,8468,2318],{"class":1199},[1059,8470,1104],{"class":1080},[1059,8472,4533],{"class":2323},[1059,8474,1524],{"class":1080},[1059,8476,7721],{"class":1199},[1059,8478,1104],{"class":1080},[1059,8480,1165],{"class":1164},[1059,8482,8483],{"class":1168},"draft",[1059,8485,1165],{"class":1164},[1059,8487,1238],{"class":1080},[1059,8489,8490,8492,8494,8496,8498,8500,8502,8504,8506,8508],{"class":1061,"line":1414},[1059,8491,2378],{"class":1100},[1059,8493,1104],{"class":1080},[1059,8495,1713],{"class":1100},[1059,8497,1088],{"class":1080},[1059,8499,2387],{"class":1112},[1059,8501,1081],{"class":1080},[1059,8503,2392],{"class":1199},[1059,8505,1104],{"class":1080},[1059,8507,1830],{"class":1829},[1059,8509,1238],{"class":1080},[1059,8511,8512],{"class":1061,"line":1427},[1059,8513,1122],{"class":1100},[1059,8515,8516,8519,8521,8523,8525,8527,8529],{"class":1061,"line":1450},[1059,8517,8518],{"class":1100},"    objects ",[1059,8520,1104],{"class":1080},[1059,8522,1713],{"class":1100},[1059,8524,1088],{"class":1080},[1059,8526,8141],{"class":1112},[1059,8528,8344],{"class":1080},[1059,8530,8531],{"class":1065},"  # Default manager\n",[1059,8533,8534,8537,8539,8541,8543],{"class":1061,"line":1479},[1059,8535,8536],{"class":1100},"    published ",[1059,8538,1104],{"class":1080},[1059,8540,8132],{"class":1112},[1059,8542,8344],{"class":1080},[1059,8544,8545],{"class":1065},"  # Custom manager\n",[1059,8547,8548],{"class":1061,"line":1500},[1059,8549,1122],{"class":1100},[1059,8551,8552],{"class":1061,"line":1507},[1059,8553,8554],{"class":1065},"    # Custom QuerySet\n",[1059,8556,8557,8559,8561,8563,8565,8568],{"class":1061,"line":1512},[1059,8558,8518],{"class":1100},[1059,8560,1104],{"class":1080},[1059,8562,8196],{"class":1100},[1059,8564,1088],{"class":1080},[1059,8566,8567],{"class":1112},"as_manager",[1059,8569,1116],{"class":1080},[1059,8571,8572],{"class":1061,"line":1535},[1059,8573,1254],{"emptyLinePlaceholder":1253},[1059,8575,8576],{"class":1061,"line":1550},[1059,8577,8578],{"class":1065},"# Usage\n",[1059,8580,8581,8584,8586,8588,8590,8592,8594,8596,8598,8601,8603,8605,8607,8610],{"class":1061,"line":1555},[1059,8582,8583],{"class":1100},"recent_published_posts ",[1059,8585,1104],{"class":1080},[1059,8587,8376],{"class":1100},[1059,8589,1088],{"class":1080},[1059,8591,1189],{"class":1157},[1059,8593,1088],{"class":1080},[1059,8595,8181],{"class":1112},[1059,8597,3776],{"class":1080},[1059,8599,8600],{"class":1112},"recent",[1059,8602,1081],{"class":1080},[1059,8604,8354],{"class":1199},[1059,8606,1104],{"class":1080},[1059,8608,8609],{"class":2323},"30",[1059,8611,1238],{"class":1080},[1059,8613,8614,8617,8619,8621,8623,8625,8627,8630,8632,8634,8636,8638],{"class":1061,"line":1576},[1059,8615,8616],{"class":1100},"author_posts ",[1059,8618,1104],{"class":1080},[1059,8620,8376],{"class":1100},[1059,8622,1088],{"class":1080},[1059,8624,1189],{"class":1157},[1059,8626,1088],{"class":1080},[1059,8628,8629],{"class":1112},"by_author",[1059,8631,1081],{"class":1080},[1059,8633,2062],{"class":1112},[1059,8635,1206],{"class":1080},[1059,8637,8181],{"class":1112},[1059,8639,1116],{"class":1080},[1026,8641,8642],{},"This comprehensive understanding of Django's philosophy and core concepts provides the foundation for building robust, maintainable web applications that leverage the framework's full potential.",[8644,8645,8646],"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 .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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--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 .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--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 .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 .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html .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 .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .srjyR, html code.shiki .srjyR{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sJFLg, html code.shiki .sJFLg{--shiki-light:#E53935;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s5q8q, html code.shiki .s5q8q{--shiki-light:#9C3EDA;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .snCua, html code.shiki .snCua{--shiki-light:#90A4AE;--shiki-default:#999999;--shiki-dark:#666666}",{"title":1054,"searchDepth":1062,"depth":1069,"links":8648},[8649,8655,8658,8661,8667],{"id":1032,"depth":1069,"text":1033,"children":8650},[8651,8652,8653,8654],{"id":1037,"depth":1097,"text":1038},{"id":1591,"depth":1097,"text":1592},{"id":1908,"depth":1097,"text":1909},{"id":2264,"depth":1097,"text":2265},{"id":2566,"depth":1069,"text":2567,"children":8656},[8657],{"id":2570,"depth":1097,"text":2571},{"id":3473,"depth":1069,"text":3474,"children":8659},[8660],{"id":3922,"depth":1097,"text":3923},{"id":4003,"depth":1069,"text":4004,"children":8662},[8663,8664,8665,8666],{"id":4007,"depth":1097,"text":4008},{"id":4870,"depth":1097,"text":4871},{"id":5622,"depth":1097,"text":5623},{"id":7059,"depth":1097,"text":7060},{"id":7598,"depth":1069,"text":7599,"children":8668},[8669,8670],{"id":7602,"depth":1097,"text":7603},{"id":8116,"depth":1097,"text":8117},"md",null,{},{"title":15,"description":1028},"NKGjgd-qwkz06O0MM9moKcrQE8k85ersXHoHR8wImDE",[8677,8679],{"title":11,"path":12,"stem":13,"description":8678,"children":-1},"Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers at the Lawrence Journal-World newspaper, it takes care of much of the hassle of web development, so you can focus on writing your app without needing to reinvent the wheel.",{"title":19,"path":20,"stem":21,"description":8680,"children":-1},"Django implements the Model-View-Template (MVT) architectural pattern, which is a variation of the traditional Model-View-Controller (MVC) pattern. Understanding the differences and similarities between these patterns is crucial for effective Django development.",1772474895357]