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