[{"data":1,"prerenderedAt":5867},["ShallowReactive",2],{"navigation":3,"/admin-site/enabling-the-admin":1016,"/admin-site/enabling-the-admin-surround":5862},[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":495,"body":1018,"description":1028,"extension":5857,"links":5858,"meta":5859,"navigation":1249,"path":496,"seo":5860,"stem":497,"__hash__":5861},"docs/12.admin-site/02.enabling-the-admin.md",{"type":1019,"value":1020,"toc":5816},"minimark",[1021,1025,1029,1034,1039,1047,1185,1189,1192,1305,1309,1312,1330,1334,1337,1351,1354,1367,1371,1375,1545,1549,1552,2081,2085,2089,2092,2257,2261,2264,2358,2491,2495,2499,2502,2632,2636,2639,3335,3339,3343,3437,3441,3622,3626,3630,3633,3952,3956,4406,4410,4414,4705,4709,4896,4900,4904,5475,5479,5483,5619,5623,5661,5665,5805,5809,5812],[1022,1023,495],"h1",{"id":1024},"enabling-the-admin",[1026,1027,1028],"p",{},"Django's admin interface comes built-in but requires some initial setup. This chapter covers everything you need to know to get the admin interface up and running.",[1030,1031,1033],"h2",{"id":1032},"initial-setup","Initial Setup",[1035,1036,1038],"h3",{"id":1037},"_1-install-admin-app","1. Install Admin App",[1026,1040,1041,1042,1046],{},"The admin app is included by default in ",[1043,1044,1045],"code",{},"INSTALLED_APPS",":",[1048,1049,1054],"pre",{"className":1050,"code":1051,"language":1052,"meta":1053,"style":1053},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# settings.py\nINSTALLED_APPS = [\n    'django.contrib.admin',        # Admin interface\n    'django.contrib.auth',         # Authentication system\n    'django.contrib.contenttypes', # Content types framework\n    'django.contrib.sessions',     # Session framework\n    'django.contrib.messages',     # Messaging framework\n    'django.contrib.staticfiles',  # Static files handling\n    # Your apps here\n]\n","python","",[1043,1055,1056,1065,1078,1098,1113,1128,1143,1158,1173,1179],{"__ignoreMap":1053},[1057,1058,1061],"span",{"class":1059,"line":1060},"line",1,[1057,1062,1064],{"class":1063},"s9Tkl","# settings.py\n",[1057,1066,1068,1071,1075],{"class":1059,"line":1067},2,[1057,1069,1045],{"class":1070},"se3Ec",[1057,1072,1074],{"class":1073},"soVBu"," =",[1057,1076,1077],{"class":1073}," [\n",[1057,1079,1081,1085,1089,1092,1095],{"class":1059,"line":1080},3,[1057,1082,1084],{"class":1083},"sbYkP","    '",[1057,1086,1088],{"class":1087},"sTbE_","django.contrib.admin",[1057,1090,1091],{"class":1083},"'",[1057,1093,1094],{"class":1073},",",[1057,1096,1097],{"class":1063},"        # Admin interface\n",[1057,1099,1101,1103,1106,1108,1110],{"class":1059,"line":1100},4,[1057,1102,1084],{"class":1083},[1057,1104,1105],{"class":1087},"django.contrib.auth",[1057,1107,1091],{"class":1083},[1057,1109,1094],{"class":1073},[1057,1111,1112],{"class":1063},"         # Authentication system\n",[1057,1114,1116,1118,1121,1123,1125],{"class":1059,"line":1115},5,[1057,1117,1084],{"class":1083},[1057,1119,1120],{"class":1087},"django.contrib.contenttypes",[1057,1122,1091],{"class":1083},[1057,1124,1094],{"class":1073},[1057,1126,1127],{"class":1063}," # Content types framework\n",[1057,1129,1131,1133,1136,1138,1140],{"class":1059,"line":1130},6,[1057,1132,1084],{"class":1083},[1057,1134,1135],{"class":1087},"django.contrib.sessions",[1057,1137,1091],{"class":1083},[1057,1139,1094],{"class":1073},[1057,1141,1142],{"class":1063},"     # Session framework\n",[1057,1144,1146,1148,1151,1153,1155],{"class":1059,"line":1145},7,[1057,1147,1084],{"class":1083},[1057,1149,1150],{"class":1087},"django.contrib.messages",[1057,1152,1091],{"class":1083},[1057,1154,1094],{"class":1073},[1057,1156,1157],{"class":1063},"     # Messaging framework\n",[1057,1159,1161,1163,1166,1168,1170],{"class":1059,"line":1160},8,[1057,1162,1084],{"class":1083},[1057,1164,1165],{"class":1087},"django.contrib.staticfiles",[1057,1167,1091],{"class":1083},[1057,1169,1094],{"class":1073},[1057,1171,1172],{"class":1063},"  # Static files handling\n",[1057,1174,1176],{"class":1059,"line":1175},9,[1057,1177,1178],{"class":1063},"    # Your apps here\n",[1057,1180,1182],{"class":1059,"line":1181},10,[1057,1183,1184],{"class":1073},"]\n",[1035,1186,1188],{"id":1187},"_2-configure-urls","2. Configure URLs",[1026,1190,1191],{},"Add admin URLs to your project's URL configuration:",[1048,1193,1195],{"className":1050,"code":1194,"language":1052,"meta":1053,"style":1053},"# urls.py\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    # Your other URL patterns\n]\n",[1043,1196,1197,1202,1224,1245,1251,1261,1296,1301],{"__ignoreMap":1053},[1057,1198,1199],{"class":1059,"line":1060},[1057,1200,1201],{"class":1063},"# urls.py\n",[1057,1203,1204,1208,1212,1215,1218,1221],{"class":1059,"line":1067},[1057,1205,1207],{"class":1206},"siDh9","from",[1057,1209,1211],{"class":1210},"sftqT"," django",[1057,1213,1214],{"class":1073},".",[1057,1216,1217],{"class":1210},"contrib ",[1057,1219,1220],{"class":1206},"import",[1057,1222,1223],{"class":1210}," admin\n",[1057,1225,1226,1228,1230,1232,1235,1237,1240,1242],{"class":1059,"line":1080},[1057,1227,1207],{"class":1206},[1057,1229,1211],{"class":1210},[1057,1231,1214],{"class":1073},[1057,1233,1234],{"class":1210},"urls ",[1057,1236,1220],{"class":1206},[1057,1238,1239],{"class":1210}," path",[1057,1241,1094],{"class":1073},[1057,1243,1244],{"class":1210}," include\n",[1057,1246,1247],{"class":1059,"line":1100},[1057,1248,1250],{"emptyLinePlaceholder":1249},true,"\n",[1057,1252,1253,1256,1259],{"class":1059,"line":1115},[1057,1254,1255],{"class":1210},"urlpatterns ",[1057,1257,1258],{"class":1073},"=",[1057,1260,1077],{"class":1073},[1057,1262,1263,1267,1270,1272,1275,1277,1279,1282,1284,1288,1290,1293],{"class":1059,"line":1130},[1057,1264,1266],{"class":1265},"siWMO","    path",[1057,1268,1269],{"class":1073},"(",[1057,1271,1091],{"class":1083},[1057,1273,1274],{"class":1087},"admin/",[1057,1276,1091],{"class":1083},[1057,1278,1094],{"class":1073},[1057,1280,1281],{"class":1265}," admin",[1057,1283,1214],{"class":1073},[1057,1285,1287],{"class":1286},"sBPpx","site",[1057,1289,1214],{"class":1073},[1057,1291,1292],{"class":1286},"urls",[1057,1294,1295],{"class":1073},"),\n",[1057,1297,1298],{"class":1059,"line":1145},[1057,1299,1300],{"class":1063},"    # Your other URL patterns\n",[1057,1302,1303],{"class":1059,"line":1160},[1057,1304,1184],{"class":1073},[1035,1306,1308],{"id":1307},"_3-run-migrations","3. Run Migrations",[1026,1310,1311],{},"Create the necessary database tables:",[1048,1313,1317],{"className":1314,"code":1315,"language":1316,"meta":1053,"style":1053},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","python manage.py migrate\n","bash",[1043,1318,1319],{"__ignoreMap":1053},[1057,1320,1321,1324,1327],{"class":1059,"line":1060},[1057,1322,1052],{"class":1323},"sYn-s",[1057,1325,1326],{"class":1087}," manage.py",[1057,1328,1329],{"class":1087}," migrate\n",[1035,1331,1333],{"id":1332},"_4-create-superuser","4. Create Superuser",[1026,1335,1336],{},"Create an admin user account:",[1048,1338,1340],{"className":1314,"code":1339,"language":1316,"meta":1053,"style":1053},"python manage.py createsuperuser\n",[1043,1341,1342],{"__ignoreMap":1053},[1057,1343,1344,1346,1348],{"class":1059,"line":1060},[1057,1345,1052],{"class":1323},[1057,1347,1326],{"class":1087},[1057,1349,1350],{"class":1087}," createsuperuser\n",[1026,1352,1353],{},"You'll be prompted to enter:",[1355,1356,1357,1361,1364],"ul",{},[1358,1359,1360],"li",{},"Username",[1358,1362,1363],{},"Email address (optional)",[1358,1365,1366],{},"Password",[1030,1368,1370],{"id":1369},"admin-configuration","Admin Configuration",[1035,1372,1374],{"id":1373},"basic-settings","Basic Settings",[1048,1376,1378],{"className":1050,"code":1377,"language":1052,"meta":1053,"style":1053},"# settings.py\n\n# Admin site configuration\nADMIN_URL = 'admin/'  # Change this for security\n\n# Admin site headers and titles\nADMIN_SITE_HEADER = 'My Site Administration'\nADMIN_SITE_TITLE = 'My Site Admin'\nADMIN_INDEX_TITLE = 'Welcome to My Site Administration'\n\n# Date and time formatting\nUSE_L10N = True\nUSE_TZ = True\nTIME_ZONE = 'UTC'\n\n# Language settings\nLANGUAGE_CODE = 'en-us'\nUSE_I18N = True\n",[1043,1379,1380,1384,1388,1393,1410,1414,1419,1434,1448,1462,1466,1472,1484,1494,1509,1514,1520,1535],{"__ignoreMap":1053},[1057,1381,1382],{"class":1059,"line":1060},[1057,1383,1064],{"class":1063},[1057,1385,1386],{"class":1059,"line":1067},[1057,1387,1250],{"emptyLinePlaceholder":1249},[1057,1389,1390],{"class":1059,"line":1080},[1057,1391,1392],{"class":1063},"# Admin site configuration\n",[1057,1394,1395,1398,1400,1403,1405,1407],{"class":1059,"line":1100},[1057,1396,1397],{"class":1070},"ADMIN_URL",[1057,1399,1074],{"class":1073},[1057,1401,1402],{"class":1083}," '",[1057,1404,1274],{"class":1087},[1057,1406,1091],{"class":1083},[1057,1408,1409],{"class":1063},"  # Change this for security\n",[1057,1411,1412],{"class":1059,"line":1115},[1057,1413,1250],{"emptyLinePlaceholder":1249},[1057,1415,1416],{"class":1059,"line":1130},[1057,1417,1418],{"class":1063},"# Admin site headers and titles\n",[1057,1420,1421,1424,1426,1428,1431],{"class":1059,"line":1145},[1057,1422,1423],{"class":1070},"ADMIN_SITE_HEADER",[1057,1425,1074],{"class":1073},[1057,1427,1402],{"class":1083},[1057,1429,1430],{"class":1087},"My Site Administration",[1057,1432,1433],{"class":1083},"'\n",[1057,1435,1436,1439,1441,1443,1446],{"class":1059,"line":1160},[1057,1437,1438],{"class":1070},"ADMIN_SITE_TITLE",[1057,1440,1074],{"class":1073},[1057,1442,1402],{"class":1083},[1057,1444,1445],{"class":1087},"My Site Admin",[1057,1447,1433],{"class":1083},[1057,1449,1450,1453,1455,1457,1460],{"class":1059,"line":1175},[1057,1451,1452],{"class":1070},"ADMIN_INDEX_TITLE",[1057,1454,1074],{"class":1073},[1057,1456,1402],{"class":1083},[1057,1458,1459],{"class":1087},"Welcome to My Site Administration",[1057,1461,1433],{"class":1083},[1057,1463,1464],{"class":1059,"line":1181},[1057,1465,1250],{"emptyLinePlaceholder":1249},[1057,1467,1469],{"class":1059,"line":1468},11,[1057,1470,1471],{"class":1063},"# Date and time formatting\n",[1057,1473,1475,1478,1480],{"class":1059,"line":1474},12,[1057,1476,1477],{"class":1070},"USE_L10N",[1057,1479,1074],{"class":1073},[1057,1481,1483],{"class":1482},"s8XtY"," True\n",[1057,1485,1487,1490,1492],{"class":1059,"line":1486},13,[1057,1488,1489],{"class":1070},"USE_TZ",[1057,1491,1074],{"class":1073},[1057,1493,1483],{"class":1482},[1057,1495,1497,1500,1502,1504,1507],{"class":1059,"line":1496},14,[1057,1498,1499],{"class":1070},"TIME_ZONE",[1057,1501,1074],{"class":1073},[1057,1503,1402],{"class":1083},[1057,1505,1506],{"class":1087},"UTC",[1057,1508,1433],{"class":1083},[1057,1510,1512],{"class":1059,"line":1511},15,[1057,1513,1250],{"emptyLinePlaceholder":1249},[1057,1515,1517],{"class":1059,"line":1516},16,[1057,1518,1519],{"class":1063},"# Language settings\n",[1057,1521,1523,1526,1528,1530,1533],{"class":1059,"line":1522},17,[1057,1524,1525],{"class":1070},"LANGUAGE_CODE",[1057,1527,1074],{"class":1073},[1057,1529,1402],{"class":1083},[1057,1531,1532],{"class":1087},"en-us",[1057,1534,1433],{"class":1083},[1057,1536,1538,1541,1543],{"class":1059,"line":1537},18,[1057,1539,1540],{"class":1070},"USE_I18N",[1057,1542,1074],{"class":1073},[1057,1544,1483],{"class":1482},[1035,1546,1548],{"id":1547},"custom-admin-site","Custom Admin Site",[1026,1550,1551],{},"Create a custom admin site for more control:",[1048,1553,1555],{"className":1050,"code":1554,"language":1052,"meta":1053,"style":1053},"# admin.py\nfrom django.contrib import admin\nfrom django.contrib.admin import AdminSite\nfrom django.urls import path\n\nclass MyAdminSite(AdminSite):\n    \"\"\"Custom admin site\"\"\"\n    \n    site_header = 'My Custom Administration'\n    site_title = 'My Admin'\n    index_title = 'Welcome to My Administration'\n    \n    def get_urls(self):\n        \"\"\"Add custom URLs to admin\"\"\"\n        urls = super().get_urls()\n        custom_urls = [\n            path('custom-view/', self.admin_view(self.custom_view), name='custom_view'),\n        ]\n        return custom_urls + urls\n    \n    def custom_view(self, request):\n        \"\"\"Custom admin view\"\"\"\n        from django.shortcuts import render\n        context = {\n            'title': 'Custom Admin View',\n            'site_header': self.site_header,\n        }\n        return render(request, 'admin/custom_view.html', context)\n\n# Create custom admin site instance\nadmin_site = MyAdminSite(name='myadmin')\n\n# Use in URLs\n# urls.py\nfrom myapp.admin import admin_site\n\nurlpatterns = [\n    path('admin/', admin_site.urls),\n]\n",[1043,1556,1557,1562,1576,1597,1612,1616,1634,1647,1652,1666,1680,1694,1698,1715,1725,1745,1754,1804,1809,1825,1830,1850,1860,1878,1889,1912,1932,1938,1968,1973,1979,2005,2010,2016,2021,2038,2043,2052,2076],{"__ignoreMap":1053},[1057,1558,1559],{"class":1059,"line":1060},[1057,1560,1561],{"class":1063},"# admin.py\n",[1057,1563,1564,1566,1568,1570,1572,1574],{"class":1059,"line":1067},[1057,1565,1207],{"class":1206},[1057,1567,1211],{"class":1210},[1057,1569,1214],{"class":1073},[1057,1571,1217],{"class":1210},[1057,1573,1220],{"class":1206},[1057,1575,1223],{"class":1210},[1057,1577,1578,1580,1582,1584,1587,1589,1592,1594],{"class":1059,"line":1080},[1057,1579,1207],{"class":1206},[1057,1581,1211],{"class":1210},[1057,1583,1214],{"class":1073},[1057,1585,1586],{"class":1210},"contrib",[1057,1588,1214],{"class":1073},[1057,1590,1591],{"class":1210},"admin ",[1057,1593,1220],{"class":1206},[1057,1595,1596],{"class":1210}," AdminSite\n",[1057,1598,1599,1601,1603,1605,1607,1609],{"class":1059,"line":1100},[1057,1600,1207],{"class":1206},[1057,1602,1211],{"class":1210},[1057,1604,1214],{"class":1073},[1057,1606,1234],{"class":1210},[1057,1608,1220],{"class":1206},[1057,1610,1611],{"class":1210}," path\n",[1057,1613,1614],{"class":1059,"line":1115},[1057,1615,1250],{"emptyLinePlaceholder":1249},[1057,1617,1618,1622,1626,1628,1631],{"class":1059,"line":1130},[1057,1619,1621],{"class":1620},"s5Kfy","class",[1057,1623,1625],{"class":1624},"sD-vU"," MyAdminSite",[1057,1627,1269],{"class":1073},[1057,1629,1630],{"class":1323},"AdminSite",[1057,1632,1633],{"class":1073},"):\n",[1057,1635,1636,1640,1644],{"class":1059,"line":1145},[1057,1637,1639],{"class":1638},"sm7ve","    \"\"\"",[1057,1641,1643],{"class":1642},"sVyVU","Custom admin site",[1057,1645,1646],{"class":1638},"\"\"\"\n",[1057,1648,1649],{"class":1059,"line":1160},[1057,1650,1651],{"class":1210},"    \n",[1057,1653,1654,1657,1659,1661,1664],{"class":1059,"line":1175},[1057,1655,1656],{"class":1210},"    site_header ",[1057,1658,1258],{"class":1073},[1057,1660,1402],{"class":1083},[1057,1662,1663],{"class":1087},"My Custom Administration",[1057,1665,1433],{"class":1083},[1057,1667,1668,1671,1673,1675,1678],{"class":1059,"line":1181},[1057,1669,1670],{"class":1210},"    site_title ",[1057,1672,1258],{"class":1073},[1057,1674,1402],{"class":1083},[1057,1676,1677],{"class":1087},"My Admin",[1057,1679,1433],{"class":1083},[1057,1681,1682,1685,1687,1689,1692],{"class":1059,"line":1468},[1057,1683,1684],{"class":1210},"    index_title ",[1057,1686,1258],{"class":1073},[1057,1688,1402],{"class":1083},[1057,1690,1691],{"class":1087},"Welcome to My Administration",[1057,1693,1433],{"class":1083},[1057,1695,1696],{"class":1059,"line":1474},[1057,1697,1651],{"class":1210},[1057,1699,1700,1703,1707,1709,1713],{"class":1059,"line":1486},[1057,1701,1702],{"class":1620},"    def",[1057,1704,1706],{"class":1705},"sljsM"," get_urls",[1057,1708,1269],{"class":1073},[1057,1710,1712],{"class":1711},"sRjD_","self",[1057,1714,1633],{"class":1073},[1057,1716,1717,1720,1723],{"class":1059,"line":1496},[1057,1718,1719],{"class":1638},"        \"\"\"",[1057,1721,1722],{"class":1642},"Add custom URLs to admin",[1057,1724,1646],{"class":1638},[1057,1726,1727,1730,1732,1736,1739,1742],{"class":1059,"line":1511},[1057,1728,1729],{"class":1210},"        urls ",[1057,1731,1258],{"class":1073},[1057,1733,1735],{"class":1734},"sa2tF"," super",[1057,1737,1738],{"class":1073},"().",[1057,1740,1741],{"class":1265},"get_urls",[1057,1743,1744],{"class":1073},"()\n",[1057,1746,1747,1750,1752],{"class":1059,"line":1516},[1057,1748,1749],{"class":1210},"        custom_urls ",[1057,1751,1258],{"class":1073},[1057,1753,1077],{"class":1073},[1057,1755,1756,1759,1761,1763,1766,1768,1770,1773,1775,1778,1780,1782,1784,1787,1790,1794,1796,1798,1800,1802],{"class":1059,"line":1522},[1057,1757,1758],{"class":1265},"            path",[1057,1760,1269],{"class":1073},[1057,1762,1091],{"class":1083},[1057,1764,1765],{"class":1087},"custom-view/",[1057,1767,1091],{"class":1083},[1057,1769,1094],{"class":1073},[1057,1771,1772],{"class":1070}," self",[1057,1774,1214],{"class":1073},[1057,1776,1777],{"class":1265},"admin_view",[1057,1779,1269],{"class":1073},[1057,1781,1712],{"class":1070},[1057,1783,1214],{"class":1073},[1057,1785,1786],{"class":1286},"custom_view",[1057,1788,1789],{"class":1073},"),",[1057,1791,1793],{"class":1792},"sqOPj"," name",[1057,1795,1258],{"class":1073},[1057,1797,1091],{"class":1083},[1057,1799,1786],{"class":1087},[1057,1801,1091],{"class":1083},[1057,1803,1295],{"class":1073},[1057,1805,1806],{"class":1059,"line":1537},[1057,1807,1808],{"class":1073},"        ]\n",[1057,1810,1812,1815,1818,1822],{"class":1059,"line":1811},19,[1057,1813,1814],{"class":1206},"        return",[1057,1816,1817],{"class":1210}," custom_urls ",[1057,1819,1821],{"class":1820},"sVsLi","+",[1057,1823,1824],{"class":1210}," urls\n",[1057,1826,1828],{"class":1059,"line":1827},20,[1057,1829,1651],{"class":1210},[1057,1831,1833,1835,1838,1840,1842,1844,1848],{"class":1059,"line":1832},21,[1057,1834,1702],{"class":1620},[1057,1836,1837],{"class":1705}," custom_view",[1057,1839,1269],{"class":1073},[1057,1841,1712],{"class":1711},[1057,1843,1094],{"class":1073},[1057,1845,1847],{"class":1846},"sCyAa"," request",[1057,1849,1633],{"class":1073},[1057,1851,1853,1855,1858],{"class":1059,"line":1852},22,[1057,1854,1719],{"class":1638},[1057,1856,1857],{"class":1642},"Custom admin view",[1057,1859,1646],{"class":1638},[1057,1861,1863,1866,1868,1870,1873,1875],{"class":1059,"line":1862},23,[1057,1864,1865],{"class":1206},"        from",[1057,1867,1211],{"class":1210},[1057,1869,1214],{"class":1073},[1057,1871,1872],{"class":1210},"shortcuts ",[1057,1874,1220],{"class":1206},[1057,1876,1877],{"class":1210}," render\n",[1057,1879,1881,1884,1886],{"class":1059,"line":1880},24,[1057,1882,1883],{"class":1210},"        context ",[1057,1885,1258],{"class":1073},[1057,1887,1888],{"class":1073}," {\n",[1057,1890,1892,1895,1898,1900,1902,1904,1907,1909],{"class":1059,"line":1891},25,[1057,1893,1894],{"class":1083},"            '",[1057,1896,1897],{"class":1087},"title",[1057,1899,1091],{"class":1083},[1057,1901,1046],{"class":1073},[1057,1903,1402],{"class":1083},[1057,1905,1906],{"class":1087},"Custom Admin View",[1057,1908,1091],{"class":1083},[1057,1910,1911],{"class":1073},",\n",[1057,1913,1915,1917,1920,1922,1924,1926,1928,1930],{"class":1059,"line":1914},26,[1057,1916,1894],{"class":1083},[1057,1918,1919],{"class":1087},"site_header",[1057,1921,1091],{"class":1083},[1057,1923,1046],{"class":1073},[1057,1925,1772],{"class":1070},[1057,1927,1214],{"class":1073},[1057,1929,1919],{"class":1286},[1057,1931,1911],{"class":1073},[1057,1933,1935],{"class":1059,"line":1934},27,[1057,1936,1937],{"class":1073},"        }\n",[1057,1939,1941,1943,1946,1948,1951,1953,1955,1958,1960,1962,1965],{"class":1059,"line":1940},28,[1057,1942,1814],{"class":1206},[1057,1944,1945],{"class":1265}," render",[1057,1947,1269],{"class":1073},[1057,1949,1950],{"class":1265},"request",[1057,1952,1094],{"class":1073},[1057,1954,1402],{"class":1083},[1057,1956,1957],{"class":1087},"admin/custom_view.html",[1057,1959,1091],{"class":1083},[1057,1961,1094],{"class":1073},[1057,1963,1964],{"class":1265}," context",[1057,1966,1967],{"class":1073},")\n",[1057,1969,1971],{"class":1059,"line":1970},29,[1057,1972,1250],{"emptyLinePlaceholder":1249},[1057,1974,1976],{"class":1059,"line":1975},30,[1057,1977,1978],{"class":1063},"# Create custom admin site instance\n",[1057,1980,1982,1985,1987,1989,1991,1994,1996,1998,2001,2003],{"class":1059,"line":1981},31,[1057,1983,1984],{"class":1210},"admin_site ",[1057,1986,1258],{"class":1073},[1057,1988,1625],{"class":1265},[1057,1990,1269],{"class":1073},[1057,1992,1993],{"class":1792},"name",[1057,1995,1258],{"class":1073},[1057,1997,1091],{"class":1083},[1057,1999,2000],{"class":1087},"myadmin",[1057,2002,1091],{"class":1083},[1057,2004,1967],{"class":1073},[1057,2006,2008],{"class":1059,"line":2007},32,[1057,2009,1250],{"emptyLinePlaceholder":1249},[1057,2011,2013],{"class":1059,"line":2012},33,[1057,2014,2015],{"class":1063},"# Use in URLs\n",[1057,2017,2019],{"class":1059,"line":2018},34,[1057,2020,1201],{"class":1063},[1057,2022,2024,2026,2029,2031,2033,2035],{"class":1059,"line":2023},35,[1057,2025,1207],{"class":1206},[1057,2027,2028],{"class":1210}," myapp",[1057,2030,1214],{"class":1073},[1057,2032,1591],{"class":1210},[1057,2034,1220],{"class":1206},[1057,2036,2037],{"class":1210}," admin_site\n",[1057,2039,2041],{"class":1059,"line":2040},36,[1057,2042,1250],{"emptyLinePlaceholder":1249},[1057,2044,2046,2048,2050],{"class":1059,"line":2045},37,[1057,2047,1255],{"class":1210},[1057,2049,1258],{"class":1073},[1057,2051,1077],{"class":1073},[1057,2053,2055,2057,2059,2061,2063,2065,2067,2070,2072,2074],{"class":1059,"line":2054},38,[1057,2056,1266],{"class":1265},[1057,2058,1269],{"class":1073},[1057,2060,1091],{"class":1083},[1057,2062,1274],{"class":1087},[1057,2064,1091],{"class":1083},[1057,2066,1094],{"class":1073},[1057,2068,2069],{"class":1265}," admin_site",[1057,2071,1214],{"class":1073},[1057,2073,1292],{"class":1286},[1057,2075,1295],{"class":1073},[1057,2077,2079],{"class":1059,"line":2078},39,[1057,2080,1184],{"class":1073},[1030,2082,2084],{"id":2083},"admin-interface-customization","Admin Interface Customization",[1035,2086,2088],{"id":2087},"changing-admin-templates","Changing Admin Templates",[1026,2090,2091],{},"Override admin templates by creating them in your templates directory:",[1048,2093,2097],{"className":2094,"code":2095,"language":2096,"meta":1053,"style":1053},"language-html shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","\u003C!-- templates/admin/base_site.html -->\n{% extends \"admin/base.html\" %}\n\n{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}\n\n{% block branding %}\n\u003Ch1 id=\"site-name\">\n    \u003Ca href=\"{% url 'admin:index' %}\">\n        \u003Cimg src=\"{% load static %}{% static 'admin/img/logo.png' %}\" alt=\"Logo\" height=\"40\">\n        My Site Administration\n    \u003C/a>\n\u003C/h1>\n{% endblock %}\n\n{% block nav-global %}{% endblock %}\n","html",[1043,2098,2099,2104,2109,2113,2118,2122,2127,2152,2174,2220,2225,2234,2243,2248,2252],{"__ignoreMap":1053},[1057,2100,2101],{"class":1059,"line":1060},[1057,2102,2103],{"class":1063},"\u003C!-- templates/admin/base_site.html -->\n",[1057,2105,2106],{"class":1059,"line":1067},[1057,2107,2108],{"class":1210},"{% extends \"admin/base.html\" %}\n",[1057,2110,2111],{"class":1059,"line":1080},[1057,2112,1250],{"emptyLinePlaceholder":1249},[1057,2114,2115],{"class":1059,"line":1100},[1057,2116,2117],{"class":1210},"{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}\n",[1057,2119,2120],{"class":1059,"line":1115},[1057,2121,1250],{"emptyLinePlaceholder":1249},[1057,2123,2124],{"class":1059,"line":1130},[1057,2125,2126],{"class":1210},"{% block branding %}\n",[1057,2128,2129,2132,2135,2139,2141,2144,2147,2149],{"class":1059,"line":1145},[1057,2130,2131],{"class":1073},"\u003C",[1057,2133,1022],{"class":2134},"sJFLg",[1057,2136,2138],{"class":2137},"s5q8q"," id",[1057,2140,1258],{"class":1073},[1057,2142,2143],{"class":1083},"\"",[1057,2145,2146],{"class":1087},"site-name",[1057,2148,2143],{"class":1083},[1057,2150,2151],{"class":1073},">\n",[1057,2153,2154,2157,2160,2163,2165,2167,2170,2172],{"class":1059,"line":1160},[1057,2155,2156],{"class":1073},"    \u003C",[1057,2158,2159],{"class":2134},"a",[1057,2161,2162],{"class":2137}," href",[1057,2164,1258],{"class":1073},[1057,2166,2143],{"class":1083},[1057,2168,2169],{"class":1087},"{% url 'admin:index' %}",[1057,2171,2143],{"class":1083},[1057,2173,2151],{"class":1073},[1057,2175,2176,2179,2182,2185,2187,2189,2192,2194,2197,2199,2201,2204,2206,2209,2211,2213,2216,2218],{"class":1059,"line":1175},[1057,2177,2178],{"class":1073},"        \u003C",[1057,2180,2181],{"class":2134},"img",[1057,2183,2184],{"class":2137}," src",[1057,2186,1258],{"class":1073},[1057,2188,2143],{"class":1083},[1057,2190,2191],{"class":1087},"{% load static %}{% static 'admin/img/logo.png' %}",[1057,2193,2143],{"class":1083},[1057,2195,2196],{"class":2137}," alt",[1057,2198,1258],{"class":1073},[1057,2200,2143],{"class":1083},[1057,2202,2203],{"class":1087},"Logo",[1057,2205,2143],{"class":1083},[1057,2207,2208],{"class":2137}," height",[1057,2210,1258],{"class":1073},[1057,2212,2143],{"class":1083},[1057,2214,2215],{"class":1087},"40",[1057,2217,2143],{"class":1083},[1057,2219,2151],{"class":1073},[1057,2221,2222],{"class":1059,"line":1181},[1057,2223,2224],{"class":1210},"        My Site Administration\n",[1057,2226,2227,2230,2232],{"class":1059,"line":1468},[1057,2228,2229],{"class":1073},"    \u003C/",[1057,2231,2159],{"class":2134},[1057,2233,2151],{"class":1073},[1057,2235,2236,2239,2241],{"class":1059,"line":1474},[1057,2237,2238],{"class":1073},"\u003C/",[1057,2240,1022],{"class":2134},[1057,2242,2151],{"class":1073},[1057,2244,2245],{"class":1059,"line":1486},[1057,2246,2247],{"class":1210},"{% endblock %}\n",[1057,2249,2250],{"class":1059,"line":1496},[1057,2251,1250],{"emptyLinePlaceholder":1249},[1057,2253,2254],{"class":1059,"line":1511},[1057,2255,2256],{"class":1210},"{% block nav-global %}{% endblock %}\n",[1035,2258,2260],{"id":2259},"custom-css-and-javascript","Custom CSS and JavaScript",[1026,2262,2263],{},"Add custom styling to the admin:",[1048,2265,2267],{"className":1050,"code":2266,"language":1052,"meta":1053,"style":1053},"# admin.py\nclass MyModelAdmin(admin.ModelAdmin):\n    class Media:\n        css = {\n            'all': ('admin/css/custom.css',)\n        }\n        js = ('admin/js/custom.js',)\n",[1043,2268,2269,2273,2292,2303,2312,2336,2340],{"__ignoreMap":1053},[1057,2270,2271],{"class":1059,"line":1060},[1057,2272,1561],{"class":1063},[1057,2274,2275,2277,2280,2282,2285,2287,2290],{"class":1059,"line":1067},[1057,2276,1621],{"class":1620},[1057,2278,2279],{"class":1624}," MyModelAdmin",[1057,2281,1269],{"class":1073},[1057,2283,2284],{"class":1323},"admin",[1057,2286,1214],{"class":1073},[1057,2288,2289],{"class":1323},"ModelAdmin",[1057,2291,1633],{"class":1073},[1057,2293,2294,2297,2300],{"class":1059,"line":1080},[1057,2295,2296],{"class":1620},"    class",[1057,2298,2299],{"class":1624}," Media",[1057,2301,2302],{"class":1073},":\n",[1057,2304,2305,2308,2310],{"class":1059,"line":1100},[1057,2306,2307],{"class":1210},"        css ",[1057,2309,1258],{"class":1073},[1057,2311,1888],{"class":1073},[1057,2313,2314,2316,2319,2321,2323,2326,2328,2331,2333],{"class":1059,"line":1115},[1057,2315,1894],{"class":1083},[1057,2317,2318],{"class":1087},"all",[1057,2320,1091],{"class":1083},[1057,2322,1046],{"class":1073},[1057,2324,2325],{"class":1073}," (",[1057,2327,1091],{"class":1083},[1057,2329,2330],{"class":1087},"admin/css/custom.css",[1057,2332,1091],{"class":1083},[1057,2334,2335],{"class":1073},",)\n",[1057,2337,2338],{"class":1059,"line":1130},[1057,2339,1937],{"class":1073},[1057,2341,2342,2345,2347,2349,2351,2354,2356],{"class":1059,"line":1145},[1057,2343,2344],{"class":1210},"        js ",[1057,2346,1258],{"class":1073},[1057,2348,2325],{"class":1073},[1057,2350,1091],{"class":1083},[1057,2352,2353],{"class":1087},"admin/js/custom.js",[1057,2355,1091],{"class":1083},[1057,2357,2335],{"class":1073},[1048,2359,2363],{"className":2360,"code":2361,"language":2362,"meta":1053,"style":1053},"language-css shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","/* static/admin/css/custom.css */\n#header {\n    background: #2c3e50;\n}\n\n#branding h1 {\n    color: #ecf0f1;\n}\n\n.module h2, .module caption, .inline-group h2 {\n    background: #34495e;\n}\n","css",[1043,2364,2365,2370,2381,2398,2403,2407,2420,2434,2438,2442,2474,2487],{"__ignoreMap":1053},[1057,2366,2367],{"class":1059,"line":1060},[1057,2368,2369],{"class":1063},"/* static/admin/css/custom.css */\n",[1057,2371,2372,2375,2379],{"class":1059,"line":1067},[1057,2373,2374],{"class":1073},"#",[1057,2376,2378],{"class":2377},"sAntY","header",[1057,2380,1888],{"class":1073},[1057,2382,2383,2387,2389,2392,2395],{"class":1059,"line":1080},[1057,2384,2386],{"class":2385},"s5HLA","    background",[1057,2388,1046],{"class":1073},[1057,2390,2391],{"class":1073}," #",[1057,2393,2394],{"class":1070},"2c3e50",[1057,2396,2397],{"class":1073},";\n",[1057,2399,2400],{"class":1059,"line":1100},[1057,2401,2402],{"class":1073},"}\n",[1057,2404,2405],{"class":1059,"line":1115},[1057,2406,1250],{"emptyLinePlaceholder":1249},[1057,2408,2409,2411,2414,2418],{"class":1059,"line":1130},[1057,2410,2374],{"class":1073},[1057,2412,2413],{"class":2377},"branding",[1057,2415,2417],{"class":2416},"skzw8"," h1",[1057,2419,1888],{"class":1073},[1057,2421,2422,2425,2427,2429,2432],{"class":1059,"line":1145},[1057,2423,2424],{"class":2385},"    color",[1057,2426,1046],{"class":1073},[1057,2428,2391],{"class":1073},[1057,2430,2431],{"class":1070},"ecf0f1",[1057,2433,2397],{"class":1073},[1057,2435,2436],{"class":1059,"line":1160},[1057,2437,2402],{"class":1073},[1057,2439,2440],{"class":1059,"line":1175},[1057,2441,1250],{"emptyLinePlaceholder":1249},[1057,2443,2444,2446,2450,2453,2455,2458,2460,2463,2465,2467,2470,2472],{"class":1059,"line":1181},[1057,2445,1214],{"class":1073},[1057,2447,2449],{"class":2448},"sKL33","module",[1057,2451,2452],{"class":2416}," h2",[1057,2454,1094],{"class":1073},[1057,2456,2457],{"class":1073}," .",[1057,2459,2449],{"class":2448},[1057,2461,2462],{"class":2416}," caption",[1057,2464,1094],{"class":1073},[1057,2466,2457],{"class":1073},[1057,2468,2469],{"class":2448},"inline-group",[1057,2471,2452],{"class":2416},[1057,2473,1888],{"class":1073},[1057,2475,2476,2478,2480,2482,2485],{"class":1059,"line":1468},[1057,2477,2386],{"class":2385},[1057,2479,1046],{"class":1073},[1057,2481,2391],{"class":1073},[1057,2483,2484],{"class":1070},"34495e",[1057,2486,2397],{"class":1073},[1057,2488,2489],{"class":1059,"line":1474},[1057,2490,2402],{"class":1073},[1030,2492,2494],{"id":2493},"admin-security-configuration","Admin Security Configuration",[1035,2496,2498],{"id":2497},"secure-admin-url","Secure Admin URL",[1026,2500,2501],{},"Change the admin URL for security:",[1048,2503,2505],{"className":1050,"code":2504,"language":1052,"meta":1053,"style":1053},"# urls.py\nfrom django.contrib import admin\nfrom django.urls import path\nimport os\n\n# Use environment variable for admin URL\nadmin_url = os.environ.get('ADMIN_URL', 'admin/')\n\nurlpatterns = [\n    path(admin_url, admin.site.urls),\n]\n",[1043,2506,2507,2511,2525,2539,2546,2550,2555,2593,2597,2605,2628],{"__ignoreMap":1053},[1057,2508,2509],{"class":1059,"line":1060},[1057,2510,1201],{"class":1063},[1057,2512,2513,2515,2517,2519,2521,2523],{"class":1059,"line":1067},[1057,2514,1207],{"class":1206},[1057,2516,1211],{"class":1210},[1057,2518,1214],{"class":1073},[1057,2520,1217],{"class":1210},[1057,2522,1220],{"class":1206},[1057,2524,1223],{"class":1210},[1057,2526,2527,2529,2531,2533,2535,2537],{"class":1059,"line":1080},[1057,2528,1207],{"class":1206},[1057,2530,1211],{"class":1210},[1057,2532,1214],{"class":1073},[1057,2534,1234],{"class":1210},[1057,2536,1220],{"class":1206},[1057,2538,1611],{"class":1210},[1057,2540,2541,2543],{"class":1059,"line":1100},[1057,2542,1220],{"class":1206},[1057,2544,2545],{"class":1210}," os\n",[1057,2547,2548],{"class":1059,"line":1115},[1057,2549,1250],{"emptyLinePlaceholder":1249},[1057,2551,2552],{"class":1059,"line":1130},[1057,2553,2554],{"class":1063},"# Use environment variable for admin URL\n",[1057,2556,2557,2560,2562,2565,2567,2570,2572,2575,2577,2579,2581,2583,2585,2587,2589,2591],{"class":1059,"line":1145},[1057,2558,2559],{"class":1210},"admin_url ",[1057,2561,1258],{"class":1073},[1057,2563,2564],{"class":1210}," os",[1057,2566,1214],{"class":1073},[1057,2568,2569],{"class":1286},"environ",[1057,2571,1214],{"class":1073},[1057,2573,2574],{"class":1265},"get",[1057,2576,1269],{"class":1073},[1057,2578,1091],{"class":1083},[1057,2580,1397],{"class":1087},[1057,2582,1091],{"class":1083},[1057,2584,1094],{"class":1073},[1057,2586,1402],{"class":1083},[1057,2588,1274],{"class":1087},[1057,2590,1091],{"class":1083},[1057,2592,1967],{"class":1073},[1057,2594,2595],{"class":1059,"line":1160},[1057,2596,1250],{"emptyLinePlaceholder":1249},[1057,2598,2599,2601,2603],{"class":1059,"line":1175},[1057,2600,1255],{"class":1210},[1057,2602,1258],{"class":1073},[1057,2604,1077],{"class":1073},[1057,2606,2607,2609,2611,2614,2616,2618,2620,2622,2624,2626],{"class":1059,"line":1181},[1057,2608,1266],{"class":1265},[1057,2610,1269],{"class":1073},[1057,2612,2613],{"class":1265},"admin_url",[1057,2615,1094],{"class":1073},[1057,2617,1281],{"class":1265},[1057,2619,1214],{"class":1073},[1057,2621,1287],{"class":1286},[1057,2623,1214],{"class":1073},[1057,2625,1292],{"class":1286},[1057,2627,1295],{"class":1073},[1057,2629,2630],{"class":1059,"line":1468},[1057,2631,1184],{"class":1073},[1035,2633,2635],{"id":2634},"ip-restriction-middleware","IP Restriction Middleware",[1026,2637,2638],{},"Restrict admin access by IP address:",[1048,2640,2642],{"className":1050,"code":2641,"language":1052,"meta":1053,"style":1053},"# middleware.py\nfrom django.http import HttpResponseForbidden\nfrom django.conf import settings\nimport ipaddress\n\nclass AdminIPRestrictionMiddleware:\n    \"\"\"Restrict admin access to specific IP addresses\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.allowed_ips = getattr(settings, 'ADMIN_ALLOWED_IPS', [])\n    \n    def __call__(self, request):\n        if request.path.startswith('/admin/'):\n            client_ip = self.get_client_ip(request)\n            \n            if not self.is_ip_allowed(client_ip):\n                return HttpResponseForbidden('Access denied')\n        \n        return self.get_response(request)\n    \n    def get_client_ip(self, request):\n        \"\"\"Get client IP address\"\"\"\n        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')\n        if x_forwarded_for:\n            ip = x_forwarded_for.split(',')[0]\n        else:\n            ip = request.META.get('REMOTE_ADDR')\n        return ip\n    \n    def is_ip_allowed(self, ip):\n        \"\"\"Check if IP is in allowed list\"\"\"\n        if not self.allowed_ips:\n            return True  # No restrictions if list is empty\n        \n        try:\n            client_ip = ipaddress.ip_address(ip)\n            for allowed_ip in self.allowed_ips:\n                if client_ip in ipaddress.ip_network(allowed_ip, strict=False):\n                    return True\n        except ValueError:\n            pass\n        \n        return False\n\n# settings.py\nMIDDLEWARE = [\n    # ... other middleware\n    'myapp.middleware.AdminIPRestrictionMiddleware',\n]\n\n# Allowed IP addresses/networks\nADMIN_ALLOWED_IPS = [\n    '192.168.1.0/24',  # Local network\n    '10.0.0.1',        # Specific IP\n]\n",[1043,2643,2644,2649,2665,2681,2688,2692,2701,2710,2714,2733,2748,2781,2785,2802,2830,2850,2855,2877,2896,2901,2917,2921,2938,2947,2977,2986,3017,3024,3051,3058,3062,3080,3089,3103,3114,3118,3125,3146,3165,3199,3207,3218,3224,3229,3237,3242,3247,3257,3263,3275,3280,3285,3291,3300,3315,3330],{"__ignoreMap":1053},[1057,2645,2646],{"class":1059,"line":1060},[1057,2647,2648],{"class":1063},"# middleware.py\n",[1057,2650,2651,2653,2655,2657,2660,2662],{"class":1059,"line":1067},[1057,2652,1207],{"class":1206},[1057,2654,1211],{"class":1210},[1057,2656,1214],{"class":1073},[1057,2658,2659],{"class":1210},"http ",[1057,2661,1220],{"class":1206},[1057,2663,2664],{"class":1210}," HttpResponseForbidden\n",[1057,2666,2667,2669,2671,2673,2676,2678],{"class":1059,"line":1080},[1057,2668,1207],{"class":1206},[1057,2670,1211],{"class":1210},[1057,2672,1214],{"class":1073},[1057,2674,2675],{"class":1210},"conf ",[1057,2677,1220],{"class":1206},[1057,2679,2680],{"class":1210}," settings\n",[1057,2682,2683,2685],{"class":1059,"line":1100},[1057,2684,1220],{"class":1206},[1057,2686,2687],{"class":1210}," ipaddress\n",[1057,2689,2690],{"class":1059,"line":1115},[1057,2691,1250],{"emptyLinePlaceholder":1249},[1057,2693,2694,2696,2699],{"class":1059,"line":1130},[1057,2695,1621],{"class":1620},[1057,2697,2698],{"class":1624}," AdminIPRestrictionMiddleware",[1057,2700,2302],{"class":1073},[1057,2702,2703,2705,2708],{"class":1059,"line":1145},[1057,2704,1639],{"class":1638},[1057,2706,2707],{"class":1642},"Restrict admin access to specific IP addresses",[1057,2709,1646],{"class":1638},[1057,2711,2712],{"class":1059,"line":1160},[1057,2713,1651],{"class":1210},[1057,2715,2716,2718,2722,2724,2726,2728,2731],{"class":1059,"line":1175},[1057,2717,1702],{"class":1620},[1057,2719,2721],{"class":2720},"sJdAF"," __init__",[1057,2723,1269],{"class":1073},[1057,2725,1712],{"class":1711},[1057,2727,1094],{"class":1073},[1057,2729,2730],{"class":1846}," get_response",[1057,2732,1633],{"class":1073},[1057,2734,2735,2738,2740,2743,2745],{"class":1059,"line":1181},[1057,2736,2737],{"class":1070},"        self",[1057,2739,1214],{"class":1073},[1057,2741,2742],{"class":1286},"get_response",[1057,2744,1074],{"class":1073},[1057,2746,2747],{"class":1210}," get_response\n",[1057,2749,2750,2752,2754,2757,2759,2762,2764,2767,2769,2771,2774,2776,2778],{"class":1059,"line":1468},[1057,2751,2737],{"class":1070},[1057,2753,1214],{"class":1073},[1057,2755,2756],{"class":1286},"allowed_ips",[1057,2758,1074],{"class":1073},[1057,2760,2761],{"class":2720}," getattr",[1057,2763,1269],{"class":1073},[1057,2765,2766],{"class":1265},"settings",[1057,2768,1094],{"class":1073},[1057,2770,1402],{"class":1083},[1057,2772,2773],{"class":1087},"ADMIN_ALLOWED_IPS",[1057,2775,1091],{"class":1083},[1057,2777,1094],{"class":1073},[1057,2779,2780],{"class":1073}," [])\n",[1057,2782,2783],{"class":1059,"line":1474},[1057,2784,1651],{"class":1210},[1057,2786,2787,2789,2792,2794,2796,2798,2800],{"class":1059,"line":1486},[1057,2788,1702],{"class":1620},[1057,2790,2791],{"class":2720}," __call__",[1057,2793,1269],{"class":1073},[1057,2795,1712],{"class":1711},[1057,2797,1094],{"class":1073},[1057,2799,1847],{"class":1846},[1057,2801,1633],{"class":1073},[1057,2803,2804,2807,2809,2811,2814,2816,2819,2821,2823,2826,2828],{"class":1059,"line":1496},[1057,2805,2806],{"class":1206},"        if",[1057,2808,1847],{"class":1210},[1057,2810,1214],{"class":1073},[1057,2812,2813],{"class":1286},"path",[1057,2815,1214],{"class":1073},[1057,2817,2818],{"class":1265},"startswith",[1057,2820,1269],{"class":1073},[1057,2822,1091],{"class":1083},[1057,2824,2825],{"class":1087},"/admin/",[1057,2827,1091],{"class":1083},[1057,2829,1633],{"class":1073},[1057,2831,2832,2835,2837,2839,2841,2844,2846,2848],{"class":1059,"line":1511},[1057,2833,2834],{"class":1210},"            client_ip ",[1057,2836,1258],{"class":1073},[1057,2838,1772],{"class":1070},[1057,2840,1214],{"class":1073},[1057,2842,2843],{"class":1265},"get_client_ip",[1057,2845,1269],{"class":1073},[1057,2847,1950],{"class":1265},[1057,2849,1967],{"class":1073},[1057,2851,2852],{"class":1059,"line":1516},[1057,2853,2854],{"class":1210},"            \n",[1057,2856,2857,2860,2863,2865,2867,2870,2872,2875],{"class":1059,"line":1522},[1057,2858,2859],{"class":1206},"            if",[1057,2861,2862],{"class":1820}," not",[1057,2864,1772],{"class":1070},[1057,2866,1214],{"class":1073},[1057,2868,2869],{"class":1265},"is_ip_allowed",[1057,2871,1269],{"class":1073},[1057,2873,2874],{"class":1265},"client_ip",[1057,2876,1633],{"class":1073},[1057,2878,2879,2882,2885,2887,2889,2892,2894],{"class":1059,"line":1537},[1057,2880,2881],{"class":1206},"                return",[1057,2883,2884],{"class":1265}," HttpResponseForbidden",[1057,2886,1269],{"class":1073},[1057,2888,1091],{"class":1083},[1057,2890,2891],{"class":1087},"Access denied",[1057,2893,1091],{"class":1083},[1057,2895,1967],{"class":1073},[1057,2897,2898],{"class":1059,"line":1811},[1057,2899,2900],{"class":1210},"        \n",[1057,2902,2903,2905,2907,2909,2911,2913,2915],{"class":1059,"line":1827},[1057,2904,1814],{"class":1206},[1057,2906,1772],{"class":1070},[1057,2908,1214],{"class":1073},[1057,2910,2742],{"class":1265},[1057,2912,1269],{"class":1073},[1057,2914,1950],{"class":1265},[1057,2916,1967],{"class":1073},[1057,2918,2919],{"class":1059,"line":1832},[1057,2920,1651],{"class":1210},[1057,2922,2923,2925,2928,2930,2932,2934,2936],{"class":1059,"line":1852},[1057,2924,1702],{"class":1620},[1057,2926,2927],{"class":1705}," get_client_ip",[1057,2929,1269],{"class":1073},[1057,2931,1712],{"class":1711},[1057,2933,1094],{"class":1073},[1057,2935,1847],{"class":1846},[1057,2937,1633],{"class":1073},[1057,2939,2940,2942,2945],{"class":1059,"line":1862},[1057,2941,1719],{"class":1638},[1057,2943,2944],{"class":1642},"Get client IP address",[1057,2946,1646],{"class":1638},[1057,2948,2949,2952,2954,2956,2958,2962,2964,2966,2968,2970,2973,2975],{"class":1059,"line":1880},[1057,2950,2951],{"class":1210},"        x_forwarded_for ",[1057,2953,1258],{"class":1073},[1057,2955,1847],{"class":1210},[1057,2957,1214],{"class":1073},[1057,2959,2961],{"class":2960},"sFGJz","META",[1057,2963,1214],{"class":1073},[1057,2965,2574],{"class":1265},[1057,2967,1269],{"class":1073},[1057,2969,1091],{"class":1083},[1057,2971,2972],{"class":1087},"HTTP_X_FORWARDED_FOR",[1057,2974,1091],{"class":1083},[1057,2976,1967],{"class":1073},[1057,2978,2979,2981,2984],{"class":1059,"line":1891},[1057,2980,2806],{"class":1206},[1057,2982,2983],{"class":1210}," x_forwarded_for",[1057,2985,2302],{"class":1073},[1057,2987,2988,2991,2993,2995,2997,3000,3002,3004,3006,3008,3011,3015],{"class":1059,"line":1914},[1057,2989,2990],{"class":1210},"            ip ",[1057,2992,1258],{"class":1073},[1057,2994,2983],{"class":1210},[1057,2996,1214],{"class":1073},[1057,2998,2999],{"class":1265},"split",[1057,3001,1269],{"class":1073},[1057,3003,1091],{"class":1083},[1057,3005,1094],{"class":1087},[1057,3007,1091],{"class":1083},[1057,3009,3010],{"class":1073},")[",[1057,3012,3014],{"class":3013},"s7CZa","0",[1057,3016,1184],{"class":1073},[1057,3018,3019,3022],{"class":1059,"line":1934},[1057,3020,3021],{"class":1206},"        else",[1057,3023,2302],{"class":1073},[1057,3025,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3047,3049],{"class":1059,"line":1940},[1057,3027,2990],{"class":1210},[1057,3029,1258],{"class":1073},[1057,3031,1847],{"class":1210},[1057,3033,1214],{"class":1073},[1057,3035,2961],{"class":2960},[1057,3037,1214],{"class":1073},[1057,3039,2574],{"class":1265},[1057,3041,1269],{"class":1073},[1057,3043,1091],{"class":1083},[1057,3045,3046],{"class":1087},"REMOTE_ADDR",[1057,3048,1091],{"class":1083},[1057,3050,1967],{"class":1073},[1057,3052,3053,3055],{"class":1059,"line":1970},[1057,3054,1814],{"class":1206},[1057,3056,3057],{"class":1210}," ip\n",[1057,3059,3060],{"class":1059,"line":1975},[1057,3061,1651],{"class":1210},[1057,3063,3064,3066,3069,3071,3073,3075,3078],{"class":1059,"line":1981},[1057,3065,1702],{"class":1620},[1057,3067,3068],{"class":1705}," is_ip_allowed",[1057,3070,1269],{"class":1073},[1057,3072,1712],{"class":1711},[1057,3074,1094],{"class":1073},[1057,3076,3077],{"class":1846}," ip",[1057,3079,1633],{"class":1073},[1057,3081,3082,3084,3087],{"class":1059,"line":2007},[1057,3083,1719],{"class":1638},[1057,3085,3086],{"class":1642},"Check if IP is in allowed list",[1057,3088,1646],{"class":1638},[1057,3090,3091,3093,3095,3097,3099,3101],{"class":1059,"line":2012},[1057,3092,2806],{"class":1206},[1057,3094,2862],{"class":1820},[1057,3096,1772],{"class":1070},[1057,3098,1214],{"class":1073},[1057,3100,2756],{"class":1286},[1057,3102,2302],{"class":1073},[1057,3104,3105,3108,3111],{"class":1059,"line":2018},[1057,3106,3107],{"class":1206},"            return",[1057,3109,3110],{"class":1482}," True",[1057,3112,3113],{"class":1063},"  # No restrictions if list is empty\n",[1057,3115,3116],{"class":1059,"line":2023},[1057,3117,2900],{"class":1210},[1057,3119,3120,3123],{"class":1059,"line":2040},[1057,3121,3122],{"class":1206},"        try",[1057,3124,2302],{"class":1073},[1057,3126,3127,3129,3131,3134,3136,3139,3141,3144],{"class":1059,"line":2045},[1057,3128,2834],{"class":1210},[1057,3130,1258],{"class":1073},[1057,3132,3133],{"class":1210}," ipaddress",[1057,3135,1214],{"class":1073},[1057,3137,3138],{"class":1265},"ip_address",[1057,3140,1269],{"class":1073},[1057,3142,3143],{"class":1265},"ip",[1057,3145,1967],{"class":1073},[1057,3147,3148,3151,3154,3157,3159,3161,3163],{"class":1059,"line":2054},[1057,3149,3150],{"class":1206},"            for",[1057,3152,3153],{"class":1210}," allowed_ip ",[1057,3155,3156],{"class":1206},"in",[1057,3158,1772],{"class":1070},[1057,3160,1214],{"class":1073},[1057,3162,2756],{"class":1286},[1057,3164,2302],{"class":1073},[1057,3166,3167,3170,3173,3175,3177,3179,3182,3184,3187,3189,3192,3194,3197],{"class":1059,"line":2078},[1057,3168,3169],{"class":1206},"                if",[1057,3171,3172],{"class":1210}," client_ip ",[1057,3174,3156],{"class":1820},[1057,3176,3133],{"class":1210},[1057,3178,1214],{"class":1073},[1057,3180,3181],{"class":1265},"ip_network",[1057,3183,1269],{"class":1073},[1057,3185,3186],{"class":1265},"allowed_ip",[1057,3188,1094],{"class":1073},[1057,3190,3191],{"class":1792}," strict",[1057,3193,1258],{"class":1073},[1057,3195,3196],{"class":1482},"False",[1057,3198,1633],{"class":1073},[1057,3200,3202,3205],{"class":1059,"line":3201},40,[1057,3203,3204],{"class":1206},"                    return",[1057,3206,1483],{"class":1482},[1057,3208,3210,3213,3216],{"class":1059,"line":3209},41,[1057,3211,3212],{"class":1206},"        except",[1057,3214,3215],{"class":1734}," ValueError",[1057,3217,2302],{"class":1073},[1057,3219,3221],{"class":1059,"line":3220},42,[1057,3222,3223],{"class":1206},"            pass\n",[1057,3225,3227],{"class":1059,"line":3226},43,[1057,3228,2900],{"class":1210},[1057,3230,3232,3234],{"class":1059,"line":3231},44,[1057,3233,1814],{"class":1206},[1057,3235,3236],{"class":1482}," False\n",[1057,3238,3240],{"class":1059,"line":3239},45,[1057,3241,1250],{"emptyLinePlaceholder":1249},[1057,3243,3245],{"class":1059,"line":3244},46,[1057,3246,1064],{"class":1063},[1057,3248,3250,3253,3255],{"class":1059,"line":3249},47,[1057,3251,3252],{"class":1070},"MIDDLEWARE",[1057,3254,1074],{"class":1073},[1057,3256,1077],{"class":1073},[1057,3258,3260],{"class":1059,"line":3259},48,[1057,3261,3262],{"class":1063},"    # ... other middleware\n",[1057,3264,3266,3268,3271,3273],{"class":1059,"line":3265},49,[1057,3267,1084],{"class":1083},[1057,3269,3270],{"class":1087},"myapp.middleware.AdminIPRestrictionMiddleware",[1057,3272,1091],{"class":1083},[1057,3274,1911],{"class":1073},[1057,3276,3278],{"class":1059,"line":3277},50,[1057,3279,1184],{"class":1073},[1057,3281,3283],{"class":1059,"line":3282},51,[1057,3284,1250],{"emptyLinePlaceholder":1249},[1057,3286,3288],{"class":1059,"line":3287},52,[1057,3289,3290],{"class":1063},"# Allowed IP addresses/networks\n",[1057,3292,3294,3296,3298],{"class":1059,"line":3293},53,[1057,3295,2773],{"class":1070},[1057,3297,1074],{"class":1073},[1057,3299,1077],{"class":1073},[1057,3301,3303,3305,3308,3310,3312],{"class":1059,"line":3302},54,[1057,3304,1084],{"class":1083},[1057,3306,3307],{"class":1087},"192.168.1.0/24",[1057,3309,1091],{"class":1083},[1057,3311,1094],{"class":1073},[1057,3313,3314],{"class":1063},"  # Local network\n",[1057,3316,3318,3320,3323,3325,3327],{"class":1059,"line":3317},55,[1057,3319,1084],{"class":1083},[1057,3321,3322],{"class":1087},"10.0.0.1",[1057,3324,1091],{"class":1083},[1057,3326,1094],{"class":1073},[1057,3328,3329],{"class":1063},"        # Specific IP\n",[1057,3331,3333],{"class":1059,"line":3332},56,[1057,3334,1184],{"class":1073},[1030,3336,3338],{"id":3337},"environment-specific-configuration","Environment-Specific Configuration",[1035,3340,3342],{"id":3341},"development-settings","Development Settings",[1048,3344,3346],{"className":1050,"code":3345,"language":1052,"meta":1053,"style":1053},"# settings/development.py\nfrom .base import *\n\n# Admin configuration for development\nADMIN_URL = 'admin/'\nDEBUG = True\n\n# Allow all IPs in development\nADMIN_ALLOWED_IPS = []\n\n# Admin site customization\nADMIN_SITE_HEADER = 'My Site Admin (Development)'\n",[1043,3347,3348,3353,3367,3371,3376,3388,3397,3401,3406,3415,3419,3424],{"__ignoreMap":1053},[1057,3349,3350],{"class":1059,"line":1060},[1057,3351,3352],{"class":1063},"# settings/development.py\n",[1057,3354,3355,3357,3359,3362,3364],{"class":1059,"line":1067},[1057,3356,1207],{"class":1206},[1057,3358,2457],{"class":1073},[1057,3360,3361],{"class":1210},"base ",[1057,3363,1220],{"class":1206},[1057,3365,3366],{"class":1820}," *\n",[1057,3368,3369],{"class":1059,"line":1080},[1057,3370,1250],{"emptyLinePlaceholder":1249},[1057,3372,3373],{"class":1059,"line":1100},[1057,3374,3375],{"class":1063},"# Admin configuration for development\n",[1057,3377,3378,3380,3382,3384,3386],{"class":1059,"line":1115},[1057,3379,1397],{"class":1070},[1057,3381,1074],{"class":1073},[1057,3383,1402],{"class":1083},[1057,3385,1274],{"class":1087},[1057,3387,1433],{"class":1083},[1057,3389,3390,3393,3395],{"class":1059,"line":1130},[1057,3391,3392],{"class":1070},"DEBUG",[1057,3394,1074],{"class":1073},[1057,3396,1483],{"class":1482},[1057,3398,3399],{"class":1059,"line":1145},[1057,3400,1250],{"emptyLinePlaceholder":1249},[1057,3402,3403],{"class":1059,"line":1160},[1057,3404,3405],{"class":1063},"# Allow all IPs in development\n",[1057,3407,3408,3410,3412],{"class":1059,"line":1175},[1057,3409,2773],{"class":1070},[1057,3411,1074],{"class":1073},[1057,3413,3414],{"class":1073}," []\n",[1057,3416,3417],{"class":1059,"line":1181},[1057,3418,1250],{"emptyLinePlaceholder":1249},[1057,3420,3421],{"class":1059,"line":1468},[1057,3422,3423],{"class":1063},"# Admin site customization\n",[1057,3425,3426,3428,3430,3432,3435],{"class":1059,"line":1474},[1057,3427,1423],{"class":1070},[1057,3429,1074],{"class":1073},[1057,3431,1402],{"class":1083},[1057,3433,3434],{"class":1087},"My Site Admin (Development)",[1057,3436,1433],{"class":1083},[1035,3438,3440],{"id":3439},"production-settings","Production Settings",[1048,3442,3444],{"className":1050,"code":3443,"language":1052,"meta":1053,"style":1053},"# settings/production.py\nfrom .base import *\nimport os\n\n# Secure admin configuration\nADMIN_URL = os.environ.get('ADMIN_URL', 'secure-admin-panel/')\nDEBUG = False\n\n# Restrict admin access\nADMIN_ALLOWED_IPS = [\n    '203.0.113.0/24',  # Office network\n]\n\n# Production admin customization\nADMIN_SITE_HEADER = 'My Site Administration'\n\n# Additional security\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\n",[1043,3445,3446,3451,3463,3469,3473,3478,3513,3521,3525,3530,3538,3552,3556,3560,3565,3577,3581,3586,3595],{"__ignoreMap":1053},[1057,3447,3448],{"class":1059,"line":1060},[1057,3449,3450],{"class":1063},"# settings/production.py\n",[1057,3452,3453,3455,3457,3459,3461],{"class":1059,"line":1067},[1057,3454,1207],{"class":1206},[1057,3456,2457],{"class":1073},[1057,3458,3361],{"class":1210},[1057,3460,1220],{"class":1206},[1057,3462,3366],{"class":1820},[1057,3464,3465,3467],{"class":1059,"line":1080},[1057,3466,1220],{"class":1206},[1057,3468,2545],{"class":1210},[1057,3470,3471],{"class":1059,"line":1100},[1057,3472,1250],{"emptyLinePlaceholder":1249},[1057,3474,3475],{"class":1059,"line":1115},[1057,3476,3477],{"class":1063},"# Secure admin configuration\n",[1057,3479,3480,3482,3484,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3509,3511],{"class":1059,"line":1130},[1057,3481,1397],{"class":1070},[1057,3483,1074],{"class":1073},[1057,3485,2564],{"class":1210},[1057,3487,1214],{"class":1073},[1057,3489,2569],{"class":1286},[1057,3491,1214],{"class":1073},[1057,3493,2574],{"class":1265},[1057,3495,1269],{"class":1073},[1057,3497,1091],{"class":1083},[1057,3499,1397],{"class":1087},[1057,3501,1091],{"class":1083},[1057,3503,1094],{"class":1073},[1057,3505,1402],{"class":1083},[1057,3507,3508],{"class":1087},"secure-admin-panel/",[1057,3510,1091],{"class":1083},[1057,3512,1967],{"class":1073},[1057,3514,3515,3517,3519],{"class":1059,"line":1145},[1057,3516,3392],{"class":1070},[1057,3518,1074],{"class":1073},[1057,3520,3236],{"class":1482},[1057,3522,3523],{"class":1059,"line":1160},[1057,3524,1250],{"emptyLinePlaceholder":1249},[1057,3526,3527],{"class":1059,"line":1175},[1057,3528,3529],{"class":1063},"# Restrict admin access\n",[1057,3531,3532,3534,3536],{"class":1059,"line":1181},[1057,3533,2773],{"class":1070},[1057,3535,1074],{"class":1073},[1057,3537,1077],{"class":1073},[1057,3539,3540,3542,3545,3547,3549],{"class":1059,"line":1468},[1057,3541,1084],{"class":1083},[1057,3543,3544],{"class":1087},"203.0.113.0/24",[1057,3546,1091],{"class":1083},[1057,3548,1094],{"class":1073},[1057,3550,3551],{"class":1063},"  # Office network\n",[1057,3553,3554],{"class":1059,"line":1474},[1057,3555,1184],{"class":1073},[1057,3557,3558],{"class":1059,"line":1486},[1057,3559,1250],{"emptyLinePlaceholder":1249},[1057,3561,3562],{"class":1059,"line":1496},[1057,3563,3564],{"class":1063},"# Production admin customization\n",[1057,3566,3567,3569,3571,3573,3575],{"class":1059,"line":1511},[1057,3568,1423],{"class":1070},[1057,3570,1074],{"class":1073},[1057,3572,1402],{"class":1083},[1057,3574,1430],{"class":1087},[1057,3576,1433],{"class":1083},[1057,3578,3579],{"class":1059,"line":1516},[1057,3580,1250],{"emptyLinePlaceholder":1249},[1057,3582,3583],{"class":1059,"line":1522},[1057,3584,3585],{"class":1063},"# Additional security\n",[1057,3587,3588,3591,3593],{"class":1059,"line":1537},[1057,3589,3590],{"class":1070},"SECURE_SSL_REDIRECT",[1057,3592,1074],{"class":1073},[1057,3594,1483],{"class":1482},[1057,3596,3597,3600,3602,3604,3606,3609,3611,3613,3615,3618,3620],{"class":1059,"line":1811},[1057,3598,3599],{"class":1070},"SECURE_PROXY_SSL_HEADER",[1057,3601,1074],{"class":1073},[1057,3603,2325],{"class":1073},[1057,3605,1091],{"class":1083},[1057,3607,3608],{"class":1087},"HTTP_X_FORWARDED_PROTO",[1057,3610,1091],{"class":1083},[1057,3612,1094],{"class":1073},[1057,3614,1402],{"class":1083},[1057,3616,3617],{"class":1087},"https",[1057,3619,1091],{"class":1083},[1057,3621,1967],{"class":1073},[1030,3623,3625],{"id":3624},"admin-logging-and-monitoring","Admin Logging and Monitoring",[1035,3627,3629],{"id":3628},"admin-action-logging","Admin Action Logging",[1026,3631,3632],{},"Django automatically logs admin actions, but you can customize this:",[1048,3634,3636],{"className":1050,"code":3635,"language":1052,"meta":1053,"style":1053},"# models.py\nfrom django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION\nfrom django.contrib.contenttypes.models import ContentType\n\ndef log_admin_action(user, obj, action_flag, change_message=''):\n    \"\"\"Log custom admin action\"\"\"\n    LogEntry.objects.log_action(\n        user_id=user.id,\n        content_type_id=ContentType.objects.get_for_model(obj).pk,\n        object_id=obj.pk,\n        object_repr=str(obj),\n        action_flag=action_flag,\n        change_message=change_message\n    )\n\n# Usage in views or admin methods\nlog_admin_action(\n    user=request.user,\n    obj=my_object,\n    action_flag=CHANGE,\n    change_message='Custom action performed'\n)\n",[1043,3637,3638,3643,3682,3706,3710,3745,3754,3772,3788,3820,3835,3851,3863,3873,3878,3882,3887,3894,3909,3921,3934,3948],{"__ignoreMap":1053},[1057,3639,3640],{"class":1059,"line":1060},[1057,3641,3642],{"class":1063},"# models.py\n",[1057,3644,3645,3647,3649,3651,3653,3655,3657,3659,3662,3664,3667,3669,3672,3674,3677,3679],{"class":1059,"line":1067},[1057,3646,1207],{"class":1206},[1057,3648,1211],{"class":1210},[1057,3650,1214],{"class":1073},[1057,3652,1586],{"class":1210},[1057,3654,1214],{"class":1073},[1057,3656,2284],{"class":1210},[1057,3658,1214],{"class":1073},[1057,3660,3661],{"class":1210},"models ",[1057,3663,1220],{"class":1206},[1057,3665,3666],{"class":1210}," LogEntry",[1057,3668,1094],{"class":1073},[1057,3670,3671],{"class":1070}," ADDITION",[1057,3673,1094],{"class":1073},[1057,3675,3676],{"class":1070}," CHANGE",[1057,3678,1094],{"class":1073},[1057,3680,3681],{"class":1070}," DELETION\n",[1057,3683,3684,3686,3688,3690,3692,3694,3697,3699,3701,3703],{"class":1059,"line":1080},[1057,3685,1207],{"class":1206},[1057,3687,1211],{"class":1210},[1057,3689,1214],{"class":1073},[1057,3691,1586],{"class":1210},[1057,3693,1214],{"class":1073},[1057,3695,3696],{"class":1210},"contenttypes",[1057,3698,1214],{"class":1073},[1057,3700,3661],{"class":1210},[1057,3702,1220],{"class":1206},[1057,3704,3705],{"class":1210}," ContentType\n",[1057,3707,3708],{"class":1059,"line":1100},[1057,3709,1250],{"emptyLinePlaceholder":1249},[1057,3711,3712,3715,3718,3720,3723,3725,3728,3730,3733,3735,3738,3740,3743],{"class":1059,"line":1115},[1057,3713,3714],{"class":1620},"def",[1057,3716,3717],{"class":1705}," log_admin_action",[1057,3719,1269],{"class":1073},[1057,3721,3722],{"class":1846},"user",[1057,3724,1094],{"class":1073},[1057,3726,3727],{"class":1846}," obj",[1057,3729,1094],{"class":1073},[1057,3731,3732],{"class":1846}," action_flag",[1057,3734,1094],{"class":1073},[1057,3736,3737],{"class":1846}," change_message",[1057,3739,1258],{"class":1820},[1057,3741,3742],{"class":1083},"''",[1057,3744,1633],{"class":1073},[1057,3746,3747,3749,3752],{"class":1059,"line":1130},[1057,3748,1639],{"class":1638},[1057,3750,3751],{"class":1642},"Log custom admin action",[1057,3753,1646],{"class":1638},[1057,3755,3756,3759,3761,3764,3766,3769],{"class":1059,"line":1145},[1057,3757,3758],{"class":1210},"    LogEntry",[1057,3760,1214],{"class":1073},[1057,3762,3763],{"class":1286},"objects",[1057,3765,1214],{"class":1073},[1057,3767,3768],{"class":1265},"log_action",[1057,3770,3771],{"class":1073},"(\n",[1057,3773,3774,3777,3779,3781,3783,3786],{"class":1059,"line":1160},[1057,3775,3776],{"class":1792},"        user_id",[1057,3778,1258],{"class":1073},[1057,3780,3722],{"class":1265},[1057,3782,1214],{"class":1073},[1057,3784,3785],{"class":1286},"id",[1057,3787,1911],{"class":1073},[1057,3789,3790,3793,3795,3798,3800,3802,3804,3807,3809,3812,3815,3818],{"class":1059,"line":1175},[1057,3791,3792],{"class":1792},"        content_type_id",[1057,3794,1258],{"class":1073},[1057,3796,3797],{"class":1265},"ContentType",[1057,3799,1214],{"class":1073},[1057,3801,3763],{"class":1286},[1057,3803,1214],{"class":1073},[1057,3805,3806],{"class":1265},"get_for_model",[1057,3808,1269],{"class":1073},[1057,3810,3811],{"class":1265},"obj",[1057,3813,3814],{"class":1073},").",[1057,3816,3817],{"class":1286},"pk",[1057,3819,1911],{"class":1073},[1057,3821,3822,3825,3827,3829,3831,3833],{"class":1059,"line":1181},[1057,3823,3824],{"class":1792},"        object_id",[1057,3826,1258],{"class":1073},[1057,3828,3811],{"class":1265},[1057,3830,1214],{"class":1073},[1057,3832,3817],{"class":1286},[1057,3834,1911],{"class":1073},[1057,3836,3837,3840,3842,3845,3847,3849],{"class":1059,"line":1468},[1057,3838,3839],{"class":1792},"        object_repr",[1057,3841,1258],{"class":1073},[1057,3843,3844],{"class":1734},"str",[1057,3846,1269],{"class":1073},[1057,3848,3811],{"class":1265},[1057,3850,1295],{"class":1073},[1057,3852,3853,3856,3858,3861],{"class":1059,"line":1474},[1057,3854,3855],{"class":1792},"        action_flag",[1057,3857,1258],{"class":1073},[1057,3859,3860],{"class":1265},"action_flag",[1057,3862,1911],{"class":1073},[1057,3864,3865,3868,3870],{"class":1059,"line":1486},[1057,3866,3867],{"class":1792},"        change_message",[1057,3869,1258],{"class":1073},[1057,3871,3872],{"class":1265},"change_message\n",[1057,3874,3875],{"class":1059,"line":1496},[1057,3876,3877],{"class":1073},"    )\n",[1057,3879,3880],{"class":1059,"line":1511},[1057,3881,1250],{"emptyLinePlaceholder":1249},[1057,3883,3884],{"class":1059,"line":1516},[1057,3885,3886],{"class":1063},"# Usage in views or admin methods\n",[1057,3888,3889,3892],{"class":1059,"line":1522},[1057,3890,3891],{"class":1265},"log_admin_action",[1057,3893,3771],{"class":1073},[1057,3895,3896,3899,3901,3903,3905,3907],{"class":1059,"line":1537},[1057,3897,3898],{"class":1792},"    user",[1057,3900,1258],{"class":1073},[1057,3902,1950],{"class":1265},[1057,3904,1214],{"class":1073},[1057,3906,3722],{"class":1286},[1057,3908,1911],{"class":1073},[1057,3910,3911,3914,3916,3919],{"class":1059,"line":1811},[1057,3912,3913],{"class":1792},"    obj",[1057,3915,1258],{"class":1073},[1057,3917,3918],{"class":1265},"my_object",[1057,3920,1911],{"class":1073},[1057,3922,3923,3926,3928,3932],{"class":1059,"line":1827},[1057,3924,3925],{"class":1792},"    action_flag",[1057,3927,1258],{"class":1073},[1057,3929,3931],{"class":3930},"s6DHA","CHANGE",[1057,3933,1911],{"class":1073},[1057,3935,3936,3939,3941,3943,3946],{"class":1059,"line":1832},[1057,3937,3938],{"class":1792},"    change_message",[1057,3940,1258],{"class":1073},[1057,3942,1091],{"class":1083},[1057,3944,3945],{"class":1087},"Custom action performed",[1057,3947,1433],{"class":1083},[1057,3949,3950],{"class":1059,"line":1852},[1057,3951,1967],{"class":1073},[1035,3953,3955],{"id":3954},"admin-activity-monitoring","Admin Activity Monitoring",[1048,3957,3959],{"className":1050,"code":3958,"language":1052,"meta":1053,"style":1053},"# admin.py\nfrom django.contrib.admin.models import LogEntry\nfrom django.contrib import admin\n\n@admin.register(LogEntry)\nclass LogEntryAdmin(admin.ModelAdmin):\n    \"\"\"Admin interface for viewing admin logs\"\"\"\n    \n    list_display = [\n        'action_time',\n        'user',\n        'content_type',\n        'object_repr',\n        'action_flag',\n        'change_message'\n    ]\n    \n    list_filter = [\n        'action_time',\n        'user',\n        'content_type',\n        'action_flag'\n    ]\n    \n    search_fields = [\n        'object_repr',\n        'change_message'\n    ]\n    \n    readonly_fields = [\n        'action_time',\n        'user',\n        'content_type',\n        'object_id',\n        'object_repr',\n        'action_flag',\n        'change_message'\n    ]\n    \n    def has_add_permission(self, request):\n        return False\n    \n    def has_change_permission(self, request, obj=None):\n        return False\n    \n    def has_delete_permission(self, request, obj=None):\n        return False\n",[1043,3960,3961,3965,3988,4002,4006,4025,4042,4051,4055,4064,4076,4086,4097,4108,4118,4127,4132,4136,4145,4155,4165,4175,4183,4187,4191,4200,4210,4218,4222,4226,4235,4245,4255,4265,4276,4286,4296,4304,4308,4312,4329,4335,4339,4365,4371,4375,4400],{"__ignoreMap":1053},[1057,3962,3963],{"class":1059,"line":1060},[1057,3964,1561],{"class":1063},[1057,3966,3967,3969,3971,3973,3975,3977,3979,3981,3983,3985],{"class":1059,"line":1067},[1057,3968,1207],{"class":1206},[1057,3970,1211],{"class":1210},[1057,3972,1214],{"class":1073},[1057,3974,1586],{"class":1210},[1057,3976,1214],{"class":1073},[1057,3978,2284],{"class":1210},[1057,3980,1214],{"class":1073},[1057,3982,3661],{"class":1210},[1057,3984,1220],{"class":1206},[1057,3986,3987],{"class":1210}," LogEntry\n",[1057,3989,3990,3992,3994,3996,3998,4000],{"class":1059,"line":1080},[1057,3991,1207],{"class":1206},[1057,3993,1211],{"class":1210},[1057,3995,1214],{"class":1073},[1057,3997,1217],{"class":1210},[1057,3999,1220],{"class":1206},[1057,4001,1223],{"class":1210},[1057,4003,4004],{"class":1059,"line":1100},[1057,4005,1250],{"emptyLinePlaceholder":1249},[1057,4007,4008,4011,4013,4015,4018,4020,4023],{"class":1059,"line":1115},[1057,4009,4010],{"class":1073},"@",[1057,4012,2284],{"class":1705},[1057,4014,1214],{"class":1073},[1057,4016,4017],{"class":1705},"register",[1057,4019,1269],{"class":1073},[1057,4021,4022],{"class":1265},"LogEntry",[1057,4024,1967],{"class":1073},[1057,4026,4027,4029,4032,4034,4036,4038,4040],{"class":1059,"line":1130},[1057,4028,1621],{"class":1620},[1057,4030,4031],{"class":1624}," LogEntryAdmin",[1057,4033,1269],{"class":1073},[1057,4035,2284],{"class":1323},[1057,4037,1214],{"class":1073},[1057,4039,2289],{"class":1323},[1057,4041,1633],{"class":1073},[1057,4043,4044,4046,4049],{"class":1059,"line":1145},[1057,4045,1639],{"class":1638},[1057,4047,4048],{"class":1642},"Admin interface for viewing admin logs",[1057,4050,1646],{"class":1638},[1057,4052,4053],{"class":1059,"line":1160},[1057,4054,1651],{"class":1210},[1057,4056,4057,4060,4062],{"class":1059,"line":1175},[1057,4058,4059],{"class":1210},"    list_display ",[1057,4061,1258],{"class":1073},[1057,4063,1077],{"class":1073},[1057,4065,4066,4069,4072,4074],{"class":1059,"line":1181},[1057,4067,4068],{"class":1083},"        '",[1057,4070,4071],{"class":1087},"action_time",[1057,4073,1091],{"class":1083},[1057,4075,1911],{"class":1073},[1057,4077,4078,4080,4082,4084],{"class":1059,"line":1468},[1057,4079,4068],{"class":1083},[1057,4081,3722],{"class":1087},[1057,4083,1091],{"class":1083},[1057,4085,1911],{"class":1073},[1057,4087,4088,4090,4093,4095],{"class":1059,"line":1474},[1057,4089,4068],{"class":1083},[1057,4091,4092],{"class":1087},"content_type",[1057,4094,1091],{"class":1083},[1057,4096,1911],{"class":1073},[1057,4098,4099,4101,4104,4106],{"class":1059,"line":1486},[1057,4100,4068],{"class":1083},[1057,4102,4103],{"class":1087},"object_repr",[1057,4105,1091],{"class":1083},[1057,4107,1911],{"class":1073},[1057,4109,4110,4112,4114,4116],{"class":1059,"line":1496},[1057,4111,4068],{"class":1083},[1057,4113,3860],{"class":1087},[1057,4115,1091],{"class":1083},[1057,4117,1911],{"class":1073},[1057,4119,4120,4122,4125],{"class":1059,"line":1511},[1057,4121,4068],{"class":1083},[1057,4123,4124],{"class":1087},"change_message",[1057,4126,1433],{"class":1083},[1057,4128,4129],{"class":1059,"line":1516},[1057,4130,4131],{"class":1073},"    ]\n",[1057,4133,4134],{"class":1059,"line":1522},[1057,4135,1651],{"class":1210},[1057,4137,4138,4141,4143],{"class":1059,"line":1537},[1057,4139,4140],{"class":1210},"    list_filter ",[1057,4142,1258],{"class":1073},[1057,4144,1077],{"class":1073},[1057,4146,4147,4149,4151,4153],{"class":1059,"line":1811},[1057,4148,4068],{"class":1083},[1057,4150,4071],{"class":1087},[1057,4152,1091],{"class":1083},[1057,4154,1911],{"class":1073},[1057,4156,4157,4159,4161,4163],{"class":1059,"line":1827},[1057,4158,4068],{"class":1083},[1057,4160,3722],{"class":1087},[1057,4162,1091],{"class":1083},[1057,4164,1911],{"class":1073},[1057,4166,4167,4169,4171,4173],{"class":1059,"line":1832},[1057,4168,4068],{"class":1083},[1057,4170,4092],{"class":1087},[1057,4172,1091],{"class":1083},[1057,4174,1911],{"class":1073},[1057,4176,4177,4179,4181],{"class":1059,"line":1852},[1057,4178,4068],{"class":1083},[1057,4180,3860],{"class":1087},[1057,4182,1433],{"class":1083},[1057,4184,4185],{"class":1059,"line":1862},[1057,4186,4131],{"class":1073},[1057,4188,4189],{"class":1059,"line":1880},[1057,4190,1651],{"class":1210},[1057,4192,4193,4196,4198],{"class":1059,"line":1891},[1057,4194,4195],{"class":1210},"    search_fields ",[1057,4197,1258],{"class":1073},[1057,4199,1077],{"class":1073},[1057,4201,4202,4204,4206,4208],{"class":1059,"line":1914},[1057,4203,4068],{"class":1083},[1057,4205,4103],{"class":1087},[1057,4207,1091],{"class":1083},[1057,4209,1911],{"class":1073},[1057,4211,4212,4214,4216],{"class":1059,"line":1934},[1057,4213,4068],{"class":1083},[1057,4215,4124],{"class":1087},[1057,4217,1433],{"class":1083},[1057,4219,4220],{"class":1059,"line":1940},[1057,4221,4131],{"class":1073},[1057,4223,4224],{"class":1059,"line":1970},[1057,4225,1651],{"class":1210},[1057,4227,4228,4231,4233],{"class":1059,"line":1975},[1057,4229,4230],{"class":1210},"    readonly_fields ",[1057,4232,1258],{"class":1073},[1057,4234,1077],{"class":1073},[1057,4236,4237,4239,4241,4243],{"class":1059,"line":1981},[1057,4238,4068],{"class":1083},[1057,4240,4071],{"class":1087},[1057,4242,1091],{"class":1083},[1057,4244,1911],{"class":1073},[1057,4246,4247,4249,4251,4253],{"class":1059,"line":2007},[1057,4248,4068],{"class":1083},[1057,4250,3722],{"class":1087},[1057,4252,1091],{"class":1083},[1057,4254,1911],{"class":1073},[1057,4256,4257,4259,4261,4263],{"class":1059,"line":2012},[1057,4258,4068],{"class":1083},[1057,4260,4092],{"class":1087},[1057,4262,1091],{"class":1083},[1057,4264,1911],{"class":1073},[1057,4266,4267,4269,4272,4274],{"class":1059,"line":2018},[1057,4268,4068],{"class":1083},[1057,4270,4271],{"class":1087},"object_id",[1057,4273,1091],{"class":1083},[1057,4275,1911],{"class":1073},[1057,4277,4278,4280,4282,4284],{"class":1059,"line":2023},[1057,4279,4068],{"class":1083},[1057,4281,4103],{"class":1087},[1057,4283,1091],{"class":1083},[1057,4285,1911],{"class":1073},[1057,4287,4288,4290,4292,4294],{"class":1059,"line":2040},[1057,4289,4068],{"class":1083},[1057,4291,3860],{"class":1087},[1057,4293,1091],{"class":1083},[1057,4295,1911],{"class":1073},[1057,4297,4298,4300,4302],{"class":1059,"line":2045},[1057,4299,4068],{"class":1083},[1057,4301,4124],{"class":1087},[1057,4303,1433],{"class":1083},[1057,4305,4306],{"class":1059,"line":2054},[1057,4307,4131],{"class":1073},[1057,4309,4310],{"class":1059,"line":2078},[1057,4311,1651],{"class":1210},[1057,4313,4314,4316,4319,4321,4323,4325,4327],{"class":1059,"line":3201},[1057,4315,1702],{"class":1620},[1057,4317,4318],{"class":1705}," has_add_permission",[1057,4320,1269],{"class":1073},[1057,4322,1712],{"class":1711},[1057,4324,1094],{"class":1073},[1057,4326,1847],{"class":1846},[1057,4328,1633],{"class":1073},[1057,4330,4331,4333],{"class":1059,"line":3209},[1057,4332,1814],{"class":1206},[1057,4334,3236],{"class":1482},[1057,4336,4337],{"class":1059,"line":3220},[1057,4338,1651],{"class":1210},[1057,4340,4341,4343,4346,4348,4350,4352,4354,4356,4358,4360,4363],{"class":1059,"line":3226},[1057,4342,1702],{"class":1620},[1057,4344,4345],{"class":1705}," has_change_permission",[1057,4347,1269],{"class":1073},[1057,4349,1712],{"class":1711},[1057,4351,1094],{"class":1073},[1057,4353,1847],{"class":1846},[1057,4355,1094],{"class":1073},[1057,4357,3727],{"class":1846},[1057,4359,1258],{"class":1820},[1057,4361,4362],{"class":1482},"None",[1057,4364,1633],{"class":1073},[1057,4366,4367,4369],{"class":1059,"line":3231},[1057,4368,1814],{"class":1206},[1057,4370,3236],{"class":1482},[1057,4372,4373],{"class":1059,"line":3239},[1057,4374,1651],{"class":1210},[1057,4376,4377,4379,4382,4384,4386,4388,4390,4392,4394,4396,4398],{"class":1059,"line":3244},[1057,4378,1702],{"class":1620},[1057,4380,4381],{"class":1705}," has_delete_permission",[1057,4383,1269],{"class":1073},[1057,4385,1712],{"class":1711},[1057,4387,1094],{"class":1073},[1057,4389,1847],{"class":1846},[1057,4391,1094],{"class":1073},[1057,4393,3727],{"class":1846},[1057,4395,1258],{"class":1820},[1057,4397,4362],{"class":1482},[1057,4399,1633],{"class":1073},[1057,4401,4402,4404],{"class":1059,"line":3249},[1057,4403,1814],{"class":1206},[1057,4405,3236],{"class":1482},[1030,4407,4409],{"id":4408},"admin-performance-optimization","Admin Performance Optimization",[1035,4411,4413],{"id":4412},"database-query-optimization","Database Query Optimization",[1048,4415,4417],{"className":1050,"code":4416,"language":1052,"meta":1053,"style":1053},"# admin.py\nclass OptimizedModelAdmin(admin.ModelAdmin):\n    \"\"\"Optimized admin with efficient queries\"\"\"\n    \n    def get_queryset(self, request):\n        \"\"\"Optimize queryset with select_related and prefetch_related\"\"\"\n        queryset = super().get_queryset(request)\n        return queryset.select_related(\n            'user',\n            'category'\n        ).prefetch_related(\n            'tags',\n            'comments'\n        )\n    \n    def get_list_display(self, request):\n        \"\"\"Dynamic list display based on user permissions\"\"\"\n        list_display = ['title', 'user', 'created_at']\n        \n        if request.user.has_perm('myapp.view_advanced_fields'):\n            list_display.extend(['status', 'priority'])\n        \n        return list_display\n",[1043,4418,4419,4423,4440,4449,4453,4470,4479,4499,4513,4523,4532,4542,4553,4562,4567,4571,4588,4597,4632,4636,4662,4694,4698],{"__ignoreMap":1053},[1057,4420,4421],{"class":1059,"line":1060},[1057,4422,1561],{"class":1063},[1057,4424,4425,4427,4430,4432,4434,4436,4438],{"class":1059,"line":1067},[1057,4426,1621],{"class":1620},[1057,4428,4429],{"class":1624}," OptimizedModelAdmin",[1057,4431,1269],{"class":1073},[1057,4433,2284],{"class":1323},[1057,4435,1214],{"class":1073},[1057,4437,2289],{"class":1323},[1057,4439,1633],{"class":1073},[1057,4441,4442,4444,4447],{"class":1059,"line":1080},[1057,4443,1639],{"class":1638},[1057,4445,4446],{"class":1642},"Optimized admin with efficient queries",[1057,4448,1646],{"class":1638},[1057,4450,4451],{"class":1059,"line":1100},[1057,4452,1651],{"class":1210},[1057,4454,4455,4457,4460,4462,4464,4466,4468],{"class":1059,"line":1115},[1057,4456,1702],{"class":1620},[1057,4458,4459],{"class":1705}," get_queryset",[1057,4461,1269],{"class":1073},[1057,4463,1712],{"class":1711},[1057,4465,1094],{"class":1073},[1057,4467,1847],{"class":1846},[1057,4469,1633],{"class":1073},[1057,4471,4472,4474,4477],{"class":1059,"line":1130},[1057,4473,1719],{"class":1638},[1057,4475,4476],{"class":1642},"Optimize queryset with select_related and prefetch_related",[1057,4478,1646],{"class":1638},[1057,4480,4481,4484,4486,4488,4490,4493,4495,4497],{"class":1059,"line":1145},[1057,4482,4483],{"class":1210},"        queryset ",[1057,4485,1258],{"class":1073},[1057,4487,1735],{"class":1734},[1057,4489,1738],{"class":1073},[1057,4491,4492],{"class":1265},"get_queryset",[1057,4494,1269],{"class":1073},[1057,4496,1950],{"class":1265},[1057,4498,1967],{"class":1073},[1057,4500,4501,4503,4506,4508,4511],{"class":1059,"line":1160},[1057,4502,1814],{"class":1206},[1057,4504,4505],{"class":1210}," queryset",[1057,4507,1214],{"class":1073},[1057,4509,4510],{"class":1265},"select_related",[1057,4512,3771],{"class":1073},[1057,4514,4515,4517,4519,4521],{"class":1059,"line":1175},[1057,4516,1894],{"class":1083},[1057,4518,3722],{"class":1087},[1057,4520,1091],{"class":1083},[1057,4522,1911],{"class":1073},[1057,4524,4525,4527,4530],{"class":1059,"line":1181},[1057,4526,1894],{"class":1083},[1057,4528,4529],{"class":1087},"category",[1057,4531,1433],{"class":1083},[1057,4533,4534,4537,4540],{"class":1059,"line":1468},[1057,4535,4536],{"class":1073},"        ).",[1057,4538,4539],{"class":1265},"prefetch_related",[1057,4541,3771],{"class":1073},[1057,4543,4544,4546,4549,4551],{"class":1059,"line":1474},[1057,4545,1894],{"class":1083},[1057,4547,4548],{"class":1087},"tags",[1057,4550,1091],{"class":1083},[1057,4552,1911],{"class":1073},[1057,4554,4555,4557,4560],{"class":1059,"line":1486},[1057,4556,1894],{"class":1083},[1057,4558,4559],{"class":1087},"comments",[1057,4561,1433],{"class":1083},[1057,4563,4564],{"class":1059,"line":1496},[1057,4565,4566],{"class":1073},"        )\n",[1057,4568,4569],{"class":1059,"line":1511},[1057,4570,1651],{"class":1210},[1057,4572,4573,4575,4578,4580,4582,4584,4586],{"class":1059,"line":1516},[1057,4574,1702],{"class":1620},[1057,4576,4577],{"class":1705}," get_list_display",[1057,4579,1269],{"class":1073},[1057,4581,1712],{"class":1711},[1057,4583,1094],{"class":1073},[1057,4585,1847],{"class":1846},[1057,4587,1633],{"class":1073},[1057,4589,4590,4592,4595],{"class":1059,"line":1522},[1057,4591,1719],{"class":1638},[1057,4593,4594],{"class":1642},"Dynamic list display based on user permissions",[1057,4596,1646],{"class":1638},[1057,4598,4599,4602,4604,4607,4609,4611,4613,4615,4617,4619,4621,4623,4625,4628,4630],{"class":1059,"line":1537},[1057,4600,4601],{"class":1210},"        list_display ",[1057,4603,1258],{"class":1073},[1057,4605,4606],{"class":1073}," [",[1057,4608,1091],{"class":1083},[1057,4610,1897],{"class":1087},[1057,4612,1091],{"class":1083},[1057,4614,1094],{"class":1073},[1057,4616,1402],{"class":1083},[1057,4618,3722],{"class":1087},[1057,4620,1091],{"class":1083},[1057,4622,1094],{"class":1073},[1057,4624,1402],{"class":1083},[1057,4626,4627],{"class":1087},"created_at",[1057,4629,1091],{"class":1083},[1057,4631,1184],{"class":1073},[1057,4633,4634],{"class":1059,"line":1811},[1057,4635,2900],{"class":1210},[1057,4637,4638,4640,4642,4644,4646,4648,4651,4653,4655,4658,4660],{"class":1059,"line":1827},[1057,4639,2806],{"class":1206},[1057,4641,1847],{"class":1210},[1057,4643,1214],{"class":1073},[1057,4645,3722],{"class":1286},[1057,4647,1214],{"class":1073},[1057,4649,4650],{"class":1265},"has_perm",[1057,4652,1269],{"class":1073},[1057,4654,1091],{"class":1083},[1057,4656,4657],{"class":1087},"myapp.view_advanced_fields",[1057,4659,1091],{"class":1083},[1057,4661,1633],{"class":1073},[1057,4663,4664,4667,4669,4672,4675,4677,4680,4682,4684,4686,4689,4691],{"class":1059,"line":1832},[1057,4665,4666],{"class":1210},"            list_display",[1057,4668,1214],{"class":1073},[1057,4670,4671],{"class":1265},"extend",[1057,4673,4674],{"class":1073},"([",[1057,4676,1091],{"class":1083},[1057,4678,4679],{"class":1087},"status",[1057,4681,1091],{"class":1083},[1057,4683,1094],{"class":1073},[1057,4685,1402],{"class":1083},[1057,4687,4688],{"class":1087},"priority",[1057,4690,1091],{"class":1083},[1057,4692,4693],{"class":1073},"])\n",[1057,4695,4696],{"class":1059,"line":1852},[1057,4697,2900],{"class":1210},[1057,4699,4700,4702],{"class":1059,"line":1862},[1057,4701,1814],{"class":1206},[1057,4703,4704],{"class":1210}," list_display\n",[1035,4706,4708],{"id":4707},"caching-admin-views","Caching Admin Views",[1048,4710,4712],{"className":1050,"code":4711,"language":1052,"meta":1053,"style":1053},"# admin.py\nfrom django.views.decorators.cache import cache_page\nfrom django.utils.decorators import method_decorator\n\n@method_decorator(cache_page(60 * 15), name='changelist_view')  # 15 minutes\nclass CachedModelAdmin(admin.ModelAdmin):\n    \"\"\"Admin with cached changelist view\"\"\"\n    \n    def changelist_view(self, request, extra_context=None):\n        \"\"\"Cached changelist view\"\"\"\n        return super().changelist_view(request, extra_context)\n",[1043,4713,4714,4718,4744,4765,4769,4811,4828,4837,4841,4867,4876],{"__ignoreMap":1053},[1057,4715,4716],{"class":1059,"line":1060},[1057,4717,1561],{"class":1063},[1057,4719,4720,4722,4724,4726,4729,4731,4734,4736,4739,4741],{"class":1059,"line":1067},[1057,4721,1207],{"class":1206},[1057,4723,1211],{"class":1210},[1057,4725,1214],{"class":1073},[1057,4727,4728],{"class":1210},"views",[1057,4730,1214],{"class":1073},[1057,4732,4733],{"class":1210},"decorators",[1057,4735,1214],{"class":1073},[1057,4737,4738],{"class":1210},"cache ",[1057,4740,1220],{"class":1206},[1057,4742,4743],{"class":1210}," cache_page\n",[1057,4745,4746,4748,4750,4752,4755,4757,4760,4762],{"class":1059,"line":1080},[1057,4747,1207],{"class":1206},[1057,4749,1211],{"class":1210},[1057,4751,1214],{"class":1073},[1057,4753,4754],{"class":1210},"utils",[1057,4756,1214],{"class":1073},[1057,4758,4759],{"class":1210},"decorators ",[1057,4761,1220],{"class":1206},[1057,4763,4764],{"class":1210}," method_decorator\n",[1057,4766,4767],{"class":1059,"line":1100},[1057,4768,1250],{"emptyLinePlaceholder":1249},[1057,4770,4771,4773,4776,4778,4781,4783,4786,4789,4792,4794,4796,4798,4800,4803,4805,4808],{"class":1059,"line":1115},[1057,4772,4010],{"class":1073},[1057,4774,4775],{"class":1705},"method_decorator",[1057,4777,1269],{"class":1073},[1057,4779,4780],{"class":1265},"cache_page",[1057,4782,1269],{"class":1073},[1057,4784,4785],{"class":3013},"60",[1057,4787,4788],{"class":1820}," *",[1057,4790,4791],{"class":3013}," 15",[1057,4793,1789],{"class":1073},[1057,4795,1793],{"class":1792},[1057,4797,1258],{"class":1073},[1057,4799,1091],{"class":1083},[1057,4801,4802],{"class":1087},"changelist_view",[1057,4804,1091],{"class":1083},[1057,4806,4807],{"class":1073},")",[1057,4809,4810],{"class":1063},"  # 15 minutes\n",[1057,4812,4813,4815,4818,4820,4822,4824,4826],{"class":1059,"line":1130},[1057,4814,1621],{"class":1620},[1057,4816,4817],{"class":1624}," CachedModelAdmin",[1057,4819,1269],{"class":1073},[1057,4821,2284],{"class":1323},[1057,4823,1214],{"class":1073},[1057,4825,2289],{"class":1323},[1057,4827,1633],{"class":1073},[1057,4829,4830,4832,4835],{"class":1059,"line":1145},[1057,4831,1639],{"class":1638},[1057,4833,4834],{"class":1642},"Admin with cached changelist view",[1057,4836,1646],{"class":1638},[1057,4838,4839],{"class":1059,"line":1160},[1057,4840,1651],{"class":1210},[1057,4842,4843,4845,4848,4850,4852,4854,4856,4858,4861,4863,4865],{"class":1059,"line":1175},[1057,4844,1702],{"class":1620},[1057,4846,4847],{"class":1705}," changelist_view",[1057,4849,1269],{"class":1073},[1057,4851,1712],{"class":1711},[1057,4853,1094],{"class":1073},[1057,4855,1847],{"class":1846},[1057,4857,1094],{"class":1073},[1057,4859,4860],{"class":1846}," extra_context",[1057,4862,1258],{"class":1820},[1057,4864,4362],{"class":1482},[1057,4866,1633],{"class":1073},[1057,4868,4869,4871,4874],{"class":1059,"line":1181},[1057,4870,1719],{"class":1638},[1057,4872,4873],{"class":1642},"Cached changelist view",[1057,4875,1646],{"class":1638},[1057,4877,4878,4880,4882,4884,4886,4888,4890,4892,4894],{"class":1059,"line":1468},[1057,4879,1814],{"class":1206},[1057,4881,1735],{"class":1734},[1057,4883,1738],{"class":1073},[1057,4885,4802],{"class":1265},[1057,4887,1269],{"class":1073},[1057,4889,1950],{"class":1265},[1057,4891,1094],{"class":1073},[1057,4893,4860],{"class":1265},[1057,4895,1967],{"class":1073},[1030,4897,4899],{"id":4898},"testing-admin-configuration","Testing Admin Configuration",[1035,4901,4903],{"id":4902},"admin-tests","Admin Tests",[1048,4905,4907],{"className":1050,"code":4906,"language":1052,"meta":1053,"style":1053},"# tests.py\nfrom django.test import TestCase, Client\nfrom django.contrib.auth.models import User\nfrom django.urls import reverse\n\nclass AdminTestCase(TestCase):\n    \"\"\"Test admin interface\"\"\"\n    \n    def setUp(self):\n        self.client = Client()\n        self.superuser = User.objects.create_superuser(\n            username='admin',\n            email='admin@example.com',\n            password='testpass123'\n        )\n    \n    def test_admin_login(self):\n        \"\"\"Test admin login\"\"\"\n        response = self.client.post(reverse('admin:login'), {\n            'username': 'admin',\n            'password': 'testpass123'\n        })\n        self.assertEqual(response.status_code, 302)\n    \n    def test_admin_access(self):\n        \"\"\"Test admin access after login\"\"\"\n        self.client.login(username='admin', password='testpass123')\n        response = self.client.get(reverse('admin:index'))\n        self.assertEqual(response.status_code, 200)\n    \n    def test_model_admin_access(self):\n        \"\"\"Test model admin access\"\"\"\n        self.client.login(username='admin', password='testpass123')\n        response = self.client.get(reverse('admin:myapp_mymodel_changelist'))\n        self.assertEqual(response.status_code, 200)\n",[1043,4908,4909,4914,4935,4959,4974,4978,4992,5001,5005,5018,5034,5059,5074,5090,5104,5108,5112,5125,5134,5170,5189,5206,5211,5237,5241,5254,5263,5303,5335,5358,5362,5375,5384,5422,5453],{"__ignoreMap":1053},[1057,4910,4911],{"class":1059,"line":1060},[1057,4912,4913],{"class":1063},"# tests.py\n",[1057,4915,4916,4918,4920,4922,4925,4927,4930,4932],{"class":1059,"line":1067},[1057,4917,1207],{"class":1206},[1057,4919,1211],{"class":1210},[1057,4921,1214],{"class":1073},[1057,4923,4924],{"class":1210},"test ",[1057,4926,1220],{"class":1206},[1057,4928,4929],{"class":1210}," TestCase",[1057,4931,1094],{"class":1073},[1057,4933,4934],{"class":1210}," Client\n",[1057,4936,4937,4939,4941,4943,4945,4947,4950,4952,4954,4956],{"class":1059,"line":1080},[1057,4938,1207],{"class":1206},[1057,4940,1211],{"class":1210},[1057,4942,1214],{"class":1073},[1057,4944,1586],{"class":1210},[1057,4946,1214],{"class":1073},[1057,4948,4949],{"class":1210},"auth",[1057,4951,1214],{"class":1073},[1057,4953,3661],{"class":1210},[1057,4955,1220],{"class":1206},[1057,4957,4958],{"class":1210}," User\n",[1057,4960,4961,4963,4965,4967,4969,4971],{"class":1059,"line":1100},[1057,4962,1207],{"class":1206},[1057,4964,1211],{"class":1210},[1057,4966,1214],{"class":1073},[1057,4968,1234],{"class":1210},[1057,4970,1220],{"class":1206},[1057,4972,4973],{"class":1210}," reverse\n",[1057,4975,4976],{"class":1059,"line":1115},[1057,4977,1250],{"emptyLinePlaceholder":1249},[1057,4979,4980,4982,4985,4987,4990],{"class":1059,"line":1130},[1057,4981,1621],{"class":1620},[1057,4983,4984],{"class":1624}," AdminTestCase",[1057,4986,1269],{"class":1073},[1057,4988,4989],{"class":1323},"TestCase",[1057,4991,1633],{"class":1073},[1057,4993,4994,4996,4999],{"class":1059,"line":1145},[1057,4995,1639],{"class":1638},[1057,4997,4998],{"class":1642},"Test admin interface",[1057,5000,1646],{"class":1638},[1057,5002,5003],{"class":1059,"line":1160},[1057,5004,1651],{"class":1210},[1057,5006,5007,5009,5012,5014,5016],{"class":1059,"line":1175},[1057,5008,1702],{"class":1620},[1057,5010,5011],{"class":1705}," setUp",[1057,5013,1269],{"class":1073},[1057,5015,1712],{"class":1711},[1057,5017,1633],{"class":1073},[1057,5019,5020,5022,5024,5027,5029,5032],{"class":1059,"line":1181},[1057,5021,2737],{"class":1070},[1057,5023,1214],{"class":1073},[1057,5025,5026],{"class":1286},"client",[1057,5028,1074],{"class":1073},[1057,5030,5031],{"class":1265}," Client",[1057,5033,1744],{"class":1073},[1057,5035,5036,5038,5040,5043,5045,5048,5050,5052,5054,5057],{"class":1059,"line":1468},[1057,5037,2737],{"class":1070},[1057,5039,1214],{"class":1073},[1057,5041,5042],{"class":1286},"superuser",[1057,5044,1074],{"class":1073},[1057,5046,5047],{"class":1210}," User",[1057,5049,1214],{"class":1073},[1057,5051,3763],{"class":1286},[1057,5053,1214],{"class":1073},[1057,5055,5056],{"class":1265},"create_superuser",[1057,5058,3771],{"class":1073},[1057,5060,5061,5064,5066,5068,5070,5072],{"class":1059,"line":1474},[1057,5062,5063],{"class":1792},"            username",[1057,5065,1258],{"class":1073},[1057,5067,1091],{"class":1083},[1057,5069,2284],{"class":1087},[1057,5071,1091],{"class":1083},[1057,5073,1911],{"class":1073},[1057,5075,5076,5079,5081,5083,5086,5088],{"class":1059,"line":1486},[1057,5077,5078],{"class":1792},"            email",[1057,5080,1258],{"class":1073},[1057,5082,1091],{"class":1083},[1057,5084,5085],{"class":1087},"admin@example.com",[1057,5087,1091],{"class":1083},[1057,5089,1911],{"class":1073},[1057,5091,5092,5095,5097,5099,5102],{"class":1059,"line":1496},[1057,5093,5094],{"class":1792},"            password",[1057,5096,1258],{"class":1073},[1057,5098,1091],{"class":1083},[1057,5100,5101],{"class":1087},"testpass123",[1057,5103,1433],{"class":1083},[1057,5105,5106],{"class":1059,"line":1511},[1057,5107,4566],{"class":1073},[1057,5109,5110],{"class":1059,"line":1516},[1057,5111,1651],{"class":1210},[1057,5113,5114,5116,5119,5121,5123],{"class":1059,"line":1522},[1057,5115,1702],{"class":1620},[1057,5117,5118],{"class":1705}," test_admin_login",[1057,5120,1269],{"class":1073},[1057,5122,1712],{"class":1711},[1057,5124,1633],{"class":1073},[1057,5126,5127,5129,5132],{"class":1059,"line":1537},[1057,5128,1719],{"class":1638},[1057,5130,5131],{"class":1642},"Test admin login",[1057,5133,1646],{"class":1638},[1057,5135,5136,5139,5141,5143,5145,5147,5149,5152,5154,5157,5159,5161,5164,5166,5168],{"class":1059,"line":1811},[1057,5137,5138],{"class":1210},"        response ",[1057,5140,1258],{"class":1073},[1057,5142,1772],{"class":1070},[1057,5144,1214],{"class":1073},[1057,5146,5026],{"class":1286},[1057,5148,1214],{"class":1073},[1057,5150,5151],{"class":1265},"post",[1057,5153,1269],{"class":1073},[1057,5155,5156],{"class":1265},"reverse",[1057,5158,1269],{"class":1073},[1057,5160,1091],{"class":1083},[1057,5162,5163],{"class":1087},"admin:login",[1057,5165,1091],{"class":1083},[1057,5167,1789],{"class":1073},[1057,5169,1888],{"class":1073},[1057,5171,5172,5174,5177,5179,5181,5183,5185,5187],{"class":1059,"line":1827},[1057,5173,1894],{"class":1083},[1057,5175,5176],{"class":1087},"username",[1057,5178,1091],{"class":1083},[1057,5180,1046],{"class":1073},[1057,5182,1402],{"class":1083},[1057,5184,2284],{"class":1087},[1057,5186,1091],{"class":1083},[1057,5188,1911],{"class":1073},[1057,5190,5191,5193,5196,5198,5200,5202,5204],{"class":1059,"line":1832},[1057,5192,1894],{"class":1083},[1057,5194,5195],{"class":1087},"password",[1057,5197,1091],{"class":1083},[1057,5199,1046],{"class":1073},[1057,5201,1402],{"class":1083},[1057,5203,5101],{"class":1087},[1057,5205,1433],{"class":1083},[1057,5207,5208],{"class":1059,"line":1852},[1057,5209,5210],{"class":1073},"        })\n",[1057,5212,5213,5215,5217,5220,5222,5225,5227,5230,5232,5235],{"class":1059,"line":1862},[1057,5214,2737],{"class":1070},[1057,5216,1214],{"class":1073},[1057,5218,5219],{"class":1265},"assertEqual",[1057,5221,1269],{"class":1073},[1057,5223,5224],{"class":1265},"response",[1057,5226,1214],{"class":1073},[1057,5228,5229],{"class":1286},"status_code",[1057,5231,1094],{"class":1073},[1057,5233,5234],{"class":3013}," 302",[1057,5236,1967],{"class":1073},[1057,5238,5239],{"class":1059,"line":1880},[1057,5240,1651],{"class":1210},[1057,5242,5243,5245,5248,5250,5252],{"class":1059,"line":1891},[1057,5244,1702],{"class":1620},[1057,5246,5247],{"class":1705}," test_admin_access",[1057,5249,1269],{"class":1073},[1057,5251,1712],{"class":1711},[1057,5253,1633],{"class":1073},[1057,5255,5256,5258,5261],{"class":1059,"line":1914},[1057,5257,1719],{"class":1638},[1057,5259,5260],{"class":1642},"Test admin access after login",[1057,5262,1646],{"class":1638},[1057,5264,5265,5267,5269,5271,5273,5276,5278,5280,5282,5284,5286,5288,5290,5293,5295,5297,5299,5301],{"class":1059,"line":1934},[1057,5266,2737],{"class":1070},[1057,5268,1214],{"class":1073},[1057,5270,5026],{"class":1286},[1057,5272,1214],{"class":1073},[1057,5274,5275],{"class":1265},"login",[1057,5277,1269],{"class":1073},[1057,5279,5176],{"class":1792},[1057,5281,1258],{"class":1073},[1057,5283,1091],{"class":1083},[1057,5285,2284],{"class":1087},[1057,5287,1091],{"class":1083},[1057,5289,1094],{"class":1073},[1057,5291,5292],{"class":1792}," password",[1057,5294,1258],{"class":1073},[1057,5296,1091],{"class":1083},[1057,5298,5101],{"class":1087},[1057,5300,1091],{"class":1083},[1057,5302,1967],{"class":1073},[1057,5304,5305,5307,5309,5311,5313,5315,5317,5319,5321,5323,5325,5327,5330,5332],{"class":1059,"line":1940},[1057,5306,5138],{"class":1210},[1057,5308,1258],{"class":1073},[1057,5310,1772],{"class":1070},[1057,5312,1214],{"class":1073},[1057,5314,5026],{"class":1286},[1057,5316,1214],{"class":1073},[1057,5318,2574],{"class":1265},[1057,5320,1269],{"class":1073},[1057,5322,5156],{"class":1265},[1057,5324,1269],{"class":1073},[1057,5326,1091],{"class":1083},[1057,5328,5329],{"class":1087},"admin:index",[1057,5331,1091],{"class":1083},[1057,5333,5334],{"class":1073},"))\n",[1057,5336,5337,5339,5341,5343,5345,5347,5349,5351,5353,5356],{"class":1059,"line":1970},[1057,5338,2737],{"class":1070},[1057,5340,1214],{"class":1073},[1057,5342,5219],{"class":1265},[1057,5344,1269],{"class":1073},[1057,5346,5224],{"class":1265},[1057,5348,1214],{"class":1073},[1057,5350,5229],{"class":1286},[1057,5352,1094],{"class":1073},[1057,5354,5355],{"class":3013}," 200",[1057,5357,1967],{"class":1073},[1057,5359,5360],{"class":1059,"line":1975},[1057,5361,1651],{"class":1210},[1057,5363,5364,5366,5369,5371,5373],{"class":1059,"line":1981},[1057,5365,1702],{"class":1620},[1057,5367,5368],{"class":1705}," test_model_admin_access",[1057,5370,1269],{"class":1073},[1057,5372,1712],{"class":1711},[1057,5374,1633],{"class":1073},[1057,5376,5377,5379,5382],{"class":1059,"line":2007},[1057,5378,1719],{"class":1638},[1057,5380,5381],{"class":1642},"Test model admin access",[1057,5383,1646],{"class":1638},[1057,5385,5386,5388,5390,5392,5394,5396,5398,5400,5402,5404,5406,5408,5410,5412,5414,5416,5418,5420],{"class":1059,"line":2012},[1057,5387,2737],{"class":1070},[1057,5389,1214],{"class":1073},[1057,5391,5026],{"class":1286},[1057,5393,1214],{"class":1073},[1057,5395,5275],{"class":1265},[1057,5397,1269],{"class":1073},[1057,5399,5176],{"class":1792},[1057,5401,1258],{"class":1073},[1057,5403,1091],{"class":1083},[1057,5405,2284],{"class":1087},[1057,5407,1091],{"class":1083},[1057,5409,1094],{"class":1073},[1057,5411,5292],{"class":1792},[1057,5413,1258],{"class":1073},[1057,5415,1091],{"class":1083},[1057,5417,5101],{"class":1087},[1057,5419,1091],{"class":1083},[1057,5421,1967],{"class":1073},[1057,5423,5424,5426,5428,5430,5432,5434,5436,5438,5440,5442,5444,5446,5449,5451],{"class":1059,"line":2018},[1057,5425,5138],{"class":1210},[1057,5427,1258],{"class":1073},[1057,5429,1772],{"class":1070},[1057,5431,1214],{"class":1073},[1057,5433,5026],{"class":1286},[1057,5435,1214],{"class":1073},[1057,5437,2574],{"class":1265},[1057,5439,1269],{"class":1073},[1057,5441,5156],{"class":1265},[1057,5443,1269],{"class":1073},[1057,5445,1091],{"class":1083},[1057,5447,5448],{"class":1087},"admin:myapp_mymodel_changelist",[1057,5450,1091],{"class":1083},[1057,5452,5334],{"class":1073},[1057,5454,5455,5457,5459,5461,5463,5465,5467,5469,5471,5473],{"class":1059,"line":2023},[1057,5456,2737],{"class":1070},[1057,5458,1214],{"class":1073},[1057,5460,5219],{"class":1265},[1057,5462,1269],{"class":1073},[1057,5464,5224],{"class":1265},[1057,5466,1214],{"class":1073},[1057,5468,5229],{"class":1286},[1057,5470,1094],{"class":1073},[1057,5472,5355],{"class":3013},[1057,5474,1967],{"class":1073},[1030,5476,5478],{"id":5477},"troubleshooting-common-issues","Troubleshooting Common Issues",[1035,5480,5482],{"id":5481},"static-files-not-loading","Static Files Not Loading",[1048,5484,5486],{"className":1050,"code":5485,"language":1052,"meta":1053,"style":1053},"# settings.py\nSTATIC_URL = '/static/'\nSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')\n\n# For development\nif DEBUG:\n    from django.conf.urls.static import static\n    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)\n",[1043,5487,5488,5492,5506,5540,5544,5549,5559,5585],{"__ignoreMap":1053},[1057,5489,5490],{"class":1059,"line":1060},[1057,5491,1064],{"class":1063},[1057,5493,5494,5497,5499,5501,5504],{"class":1059,"line":1067},[1057,5495,5496],{"class":1070},"STATIC_URL",[1057,5498,1074],{"class":1073},[1057,5500,1402],{"class":1083},[1057,5502,5503],{"class":1087},"/static/",[1057,5505,1433],{"class":1083},[1057,5507,5508,5511,5513,5515,5517,5519,5521,5524,5526,5529,5531,5533,5536,5538],{"class":1059,"line":1080},[1057,5509,5510],{"class":1070},"STATIC_ROOT",[1057,5512,1074],{"class":1073},[1057,5514,2564],{"class":1210},[1057,5516,1214],{"class":1073},[1057,5518,2813],{"class":1286},[1057,5520,1214],{"class":1073},[1057,5522,5523],{"class":1265},"join",[1057,5525,1269],{"class":1073},[1057,5527,5528],{"class":3930},"BASE_DIR",[1057,5530,1094],{"class":1073},[1057,5532,1402],{"class":1083},[1057,5534,5535],{"class":1087},"staticfiles",[1057,5537,1091],{"class":1083},[1057,5539,1967],{"class":1073},[1057,5541,5542],{"class":1059,"line":1100},[1057,5543,1250],{"emptyLinePlaceholder":1249},[1057,5545,5546],{"class":1059,"line":1115},[1057,5547,5548],{"class":1063},"# For development\n",[1057,5550,5551,5554,5557],{"class":1059,"line":1130},[1057,5552,5553],{"class":1206},"if",[1057,5555,5556],{"class":1070}," DEBUG",[1057,5558,2302],{"class":1073},[1057,5560,5561,5564,5566,5568,5571,5573,5575,5577,5580,5582],{"class":1059,"line":1145},[1057,5562,5563],{"class":1206},"    from",[1057,5565,1211],{"class":1210},[1057,5567,1214],{"class":1073},[1057,5569,5570],{"class":1210},"conf",[1057,5572,1214],{"class":1073},[1057,5574,1292],{"class":1210},[1057,5576,1214],{"class":1073},[1057,5578,5579],{"class":1210},"static ",[1057,5581,1220],{"class":1206},[1057,5583,5584],{"class":1210}," static\n",[1057,5586,5587,5590,5593,5596,5598,5600,5602,5604,5606,5609,5611,5613,5615,5617],{"class":1059,"line":1160},[1057,5588,5589],{"class":1210},"    urlpatterns ",[1057,5591,5592],{"class":1073},"+=",[1057,5594,5595],{"class":1265}," static",[1057,5597,1269],{"class":1073},[1057,5599,2766],{"class":1265},[1057,5601,1214],{"class":1073},[1057,5603,5496],{"class":2960},[1057,5605,1094],{"class":1073},[1057,5607,5608],{"class":1792}," document_root",[1057,5610,1258],{"class":1073},[1057,5612,2766],{"class":1265},[1057,5614,1214],{"class":1073},[1057,5616,5510],{"class":2960},[1057,5618,1967],{"class":1073},[1035,5620,5622],{"id":5621},"admin-cssjs-issues","Admin CSS/JS Issues",[1048,5624,5626],{"className":1314,"code":5625,"language":1316,"meta":1053,"style":1053},"# Collect static files\npython manage.py collectstatic\n\n# Clear browser cache\n# Check STATIC_URL and STATIC_ROOT settings\n# Verify static files middleware is installed\n",[1043,5627,5628,5633,5642,5646,5651,5656],{"__ignoreMap":1053},[1057,5629,5630],{"class":1059,"line":1060},[1057,5631,5632],{"class":1063},"# Collect static files\n",[1057,5634,5635,5637,5639],{"class":1059,"line":1067},[1057,5636,1052],{"class":1323},[1057,5638,1326],{"class":1087},[1057,5640,5641],{"class":1087}," collectstatic\n",[1057,5643,5644],{"class":1059,"line":1080},[1057,5645,1250],{"emptyLinePlaceholder":1249},[1057,5647,5648],{"class":1059,"line":1100},[1057,5649,5650],{"class":1063},"# Clear browser cache\n",[1057,5652,5653],{"class":1059,"line":1115},[1057,5654,5655],{"class":1063},"# Check STATIC_URL and STATIC_ROOT settings\n",[1057,5657,5658],{"class":1059,"line":1130},[1057,5659,5660],{"class":1063},"# Verify static files middleware is installed\n",[1035,5662,5664],{"id":5663},"permission-errors","Permission Errors",[1048,5666,5668],{"className":1050,"code":5667,"language":1052,"meta":1053,"style":1053},"# Check user permissions\nuser.is_staff = True      # Required for admin access\nuser.is_superuser = True  # Full admin access\nuser.save()\n\n# Or assign specific permissions\nfrom django.contrib.auth.models import Permission\npermission = Permission.objects.get(codename='add_mymodel')\nuser.user_permissions.add(permission)\n",[1043,5669,5670,5675,5691,5707,5718,5722,5727,5750,5784],{"__ignoreMap":1053},[1057,5671,5672],{"class":1059,"line":1060},[1057,5673,5674],{"class":1063},"# Check user permissions\n",[1057,5676,5677,5679,5681,5684,5686,5688],{"class":1059,"line":1067},[1057,5678,3722],{"class":1210},[1057,5680,1214],{"class":1073},[1057,5682,5683],{"class":1286},"is_staff",[1057,5685,1074],{"class":1073},[1057,5687,3110],{"class":1482},[1057,5689,5690],{"class":1063},"      # Required for admin access\n",[1057,5692,5693,5695,5697,5700,5702,5704],{"class":1059,"line":1080},[1057,5694,3722],{"class":1210},[1057,5696,1214],{"class":1073},[1057,5698,5699],{"class":1286},"is_superuser",[1057,5701,1074],{"class":1073},[1057,5703,3110],{"class":1482},[1057,5705,5706],{"class":1063},"  # Full admin access\n",[1057,5708,5709,5711,5713,5716],{"class":1059,"line":1100},[1057,5710,3722],{"class":1210},[1057,5712,1214],{"class":1073},[1057,5714,5715],{"class":1265},"save",[1057,5717,1744],{"class":1073},[1057,5719,5720],{"class":1059,"line":1115},[1057,5721,1250],{"emptyLinePlaceholder":1249},[1057,5723,5724],{"class":1059,"line":1130},[1057,5725,5726],{"class":1063},"# Or assign specific permissions\n",[1057,5728,5729,5731,5733,5735,5737,5739,5741,5743,5745,5747],{"class":1059,"line":1145},[1057,5730,1207],{"class":1206},[1057,5732,1211],{"class":1210},[1057,5734,1214],{"class":1073},[1057,5736,1586],{"class":1210},[1057,5738,1214],{"class":1073},[1057,5740,4949],{"class":1210},[1057,5742,1214],{"class":1073},[1057,5744,3661],{"class":1210},[1057,5746,1220],{"class":1206},[1057,5748,5749],{"class":1210}," Permission\n",[1057,5751,5752,5755,5757,5760,5762,5764,5766,5768,5770,5773,5775,5777,5780,5782],{"class":1059,"line":1160},[1057,5753,5754],{"class":1210},"permission ",[1057,5756,1258],{"class":1073},[1057,5758,5759],{"class":1210}," Permission",[1057,5761,1214],{"class":1073},[1057,5763,3763],{"class":1286},[1057,5765,1214],{"class":1073},[1057,5767,2574],{"class":1265},[1057,5769,1269],{"class":1073},[1057,5771,5772],{"class":1792},"codename",[1057,5774,1258],{"class":1073},[1057,5776,1091],{"class":1083},[1057,5778,5779],{"class":1087},"add_mymodel",[1057,5781,1091],{"class":1083},[1057,5783,1967],{"class":1073},[1057,5785,5786,5788,5790,5793,5795,5798,5800,5803],{"class":1059,"line":1175},[1057,5787,3722],{"class":1210},[1057,5789,1214],{"class":1073},[1057,5791,5792],{"class":1286},"user_permissions",[1057,5794,1214],{"class":1073},[1057,5796,5797],{"class":1265},"add",[1057,5799,1269],{"class":1073},[1057,5801,5802],{"class":1265},"permission",[1057,5804,1967],{"class":1073},[1030,5806,5808],{"id":5807},"next-steps","Next Steps",[1026,5810,5811],{},"Now that you have the admin interface enabled and configured, let's learn how to register your models and make them available in the admin interface.",[5813,5814,5815],"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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}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 .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 .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}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 .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 .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 .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}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 .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 .sAntY, html code.shiki .sAntY{--shiki-light:#F76D47;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .s5HLA, html code.shiki .s5HLA{--shiki-light:#8796B0;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .skzw8, html code.shiki .skzw8{--shiki-light:#E2931D;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sKL33, html code.shiki .sKL33{--shiki-light:#E2931D;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1053,"searchDepth":1060,"depth":1067,"links":5817},[5818,5824,5828,5832,5836,5840,5844,5848,5851,5856],{"id":1032,"depth":1067,"text":1033,"children":5819},[5820,5821,5822,5823],{"id":1037,"depth":1080,"text":1038},{"id":1187,"depth":1080,"text":1188},{"id":1307,"depth":1080,"text":1308},{"id":1332,"depth":1080,"text":1333},{"id":1369,"depth":1067,"text":1370,"children":5825},[5826,5827],{"id":1373,"depth":1080,"text":1374},{"id":1547,"depth":1080,"text":1548},{"id":2083,"depth":1067,"text":2084,"children":5829},[5830,5831],{"id":2087,"depth":1080,"text":2088},{"id":2259,"depth":1080,"text":2260},{"id":2493,"depth":1067,"text":2494,"children":5833},[5834,5835],{"id":2497,"depth":1080,"text":2498},{"id":2634,"depth":1080,"text":2635},{"id":3337,"depth":1067,"text":3338,"children":5837},[5838,5839],{"id":3341,"depth":1080,"text":3342},{"id":3439,"depth":1080,"text":3440},{"id":3624,"depth":1067,"text":3625,"children":5841},[5842,5843],{"id":3628,"depth":1080,"text":3629},{"id":3954,"depth":1080,"text":3955},{"id":4408,"depth":1067,"text":4409,"children":5845},[5846,5847],{"id":4412,"depth":1080,"text":4413},{"id":4707,"depth":1080,"text":4708},{"id":4898,"depth":1067,"text":4899,"children":5849},[5850],{"id":4902,"depth":1080,"text":4903},{"id":5477,"depth":1067,"text":5478,"children":5852},[5853,5854,5855],{"id":5481,"depth":1080,"text":5482},{"id":5621,"depth":1080,"text":5622},{"id":5663,"depth":1080,"text":5664},{"id":5807,"depth":1067,"text":5808},"md",null,{},{"title":495,"description":1028},"4xlx9RpKcq7Xk8h439sVnKhdenUYka43vkhWj8iCaUQ",[5863,5865],{"title":489,"path":490,"stem":491,"description":5864,"children":-1},"Django's admin interface is one of its most powerful features, providing a ready-to-use administrative interface for your models. It's designed to be used by non-technical users to manage content and data, making it an essential tool for content management and site administration.",{"title":499,"path":500,"stem":501,"description":5866,"children":-1},"To make your models available in the Django admin interface, you need to register them. This chapter covers various ways to register models and basic configuration options.",1772474934724]