{"title":"Scrivere la tua prima applicazione in Django, parte 7","version":"4.2","locale":"it","docname":"intro/tutorial07","url":"/it/4.2/intro/tutorial07/","canonical":"https://djangodocs.dev/it/4.2/intro/tutorial07/","summary":"Questo tutorial inizia dove si è interrotto Tutorial 6 . Stiamo proseguendo con l’applicazione web per i questionari e ci concentreremo sul sito generato…","html":"<h1>Scrivere la tua prima applicazione in Django, parte 7<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-7\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Questo tutorial inizia dove si è interrotto <a class=\"reference internal\" href=\"/it/4.2/intro/tutorial06/\"><span class=\"doc\">Tutorial 6</span></a>. Stiamo proseguendo con l’applicazione web per i questionari e ci concentreremo sul sito generato automaticamente per l’amministrazione di Django che abbiamo esplorato in prima battuta nel <a class=\"reference internal\" href=\"/it/4.2/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Dove trovare aiuto:</p>\n<p>Se hai difficoltà a completare questo tutorial,  per favore vai alla sezione <a class=\"reference internal\" href=\"/it/4.2/faq/help/\"><span class=\"doc\">Getting Help</span></a> delle FAQ.</p>\n</aside>\n<section id=\"customize-the-admin-form\">\n<h2>Personalizzare il modulo di amministrazione<a class=\"heading-anchor\" href=\"#customize-the-admin-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Registrando il modello <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> con <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code>, Django è stato in grado di costruire un form di default. Spesso, vorrai personalizzare il modo in cui il form di amministrazione appare e funziona. Lo farai dicendo a Django quali opzioni vuoi quando registrerai l’oggetto.</p>\n<p>Vediamo come funziona riordinando i campi nel modulo di modifica. Sostituisci la riga <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code> con:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Seguirai questo pattern – crea una classe del modello di amministrazione, poi passala come secondo argomento a  <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register()</span></code> – ogni volta che vuoi cambiare le opzioni nel panello di amministrazione del modello.</p>\n<p>Questa particolare modifica qui sopra fa sì che la «Data di pubblicazione» venga prima del campo «Domanda»:</p>\n<img alt=\"I campi sono stati riordinati\" src=\"/it/4.2/_images/admin07.png\" />\n<p>Questo non è impressionante con solo due campi, ma per i moduli di amministrazione con dozzine di campi, la scelta di un ordine intuitivo è un dettaglio importante per l’usabilità.</p>\n<p>E parlando di moduli con dozzine di campi, potresti voler dividere il modulo in gruppi di campi:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Date information&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Il primo elemento di ogni tupla in <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code></a> è il titolo del fieldset. Ecco come il nostro form appare adesso:</p>\n<img alt=\"I form ora hanno i fieldset\" src=\"/it/4.2/_images/admin08t.png\" />\n</section>\n<section id=\"adding-related-objects\">\n<h2>Aggiunta di oggetti correlati<a class=\"heading-anchor\" href=\"#adding-related-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>OK, abbiamo la nostra pagina di amministrazione del modello Question, ma una  <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> ha più <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>, e il pannello di amministrazione non mostra le scelte.</p>\n<p>Ancora.</p>\n<p>Esistono due modi per risolvere questo problema. Il primo è registrare <code class=\"docutils literal notranslate\"><span class=\"pre\">Scelta</span></code> nell’amministrazione proprio come abbiamo fatto con <code class=\"docutils literal notranslate\"><span class=\"pre\">Domanda</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n<span class=\"c1\"># ...</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Choice</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Ora «Scelte» è un’opzione disponibile nell’amministrazione di Django. Il modulo «Aggiungi scelta» ha questo aspetto:</p>\n<img alt=\"Pagina di amministrazione per le scelte\" src=\"/it/4.2/_images/admin09.png\" />\n<p>In quel form, il campo «Question» è un menu a tendina contenente tutte le domande nel database. Django sa che una <a class=\"reference internal\" href=\"/it/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> dovrebbe essere rappresentata nell’admin come una <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select&gt;</span></code>. Nel nostro caso, esiste solo una domanda a questo punto.</p>\n<p>Nota anche il link «Aggiungi un’altra domanda» vicino a «Domanda.» Ogni oggetto con una relazione di <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> lo ottiene gratis. Quando farai click su «Aggiungi un’altra domanda», vedrai una finestra di popup con il form «Aggiungi domanda». Se aggiungi una domanda in quella finestra e fai click su «Salva», Django salverà la richiesta sul database e la aggiungerà come scelta selezionata nel form «Aggiungi scelta» che stai guardando.</p>\n<p>Ma, onestamente, questo è un modo inefficiente di aggiungere oggetti <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> al sistema. Sarebbe meglio se potessi aggiungere un gruppo di Choices direttamente quando crei l’oggetto <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Facciamolo.</p>\n<p>Rimuovere la chiamata <code class=\"docutils literal notranslate\"><span class=\"pre\">register()</span></code> per il modello <code class=\"docutils literal notranslate\"><span class=\"pre\">Scelta</span></code>. Quindi, modifica il codice di registrazione <code class=\"docutils literal notranslate\"><span class=\"pre\">Domanda</span></code> per leggere:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">StackedInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Choice</span>\n    <span class=\"n\">extra</span> <span class=\"o\">=</span> <span class=\"mi\">3</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Date information&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">],</span> <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ChoiceInline</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Questo dice a Django: gli oggetti «<code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> sono modificati nella pagina di amministrazione del modello <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Di default, fornisce abbastanza campi per 3 scelte.</p>\n<p>Carica la pagina «Aggiungi domanda» per vedere come appare:</p>\n<img alt=\"La pagina di aggiunta di una domanda ora contiene le scelte\" src=\"/it/4.2/_images/admin10t.png\" />\n<p>Funziona in questo modo: Ci sono tre slot per le relative Choices – come specificato dall” <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> – e ogni volta torni alla pagina «Change» per un oggetto che è stato già creato, tu vedi altri ricevi slot.</p>\n<p>Alla fine dei tre slot, troverai un link «Aggiungi un’altra Choice». Se ci clicchi, un nuovo slot viene aggiunto. Se vuoi rimuovere uno slot aggiunto, puoi cliccare sulla X in alto a destra dello slot aggiunto. Questa immagine mostra lo slot aggiunto:</p>\n<img alt=\"Slot aggiuntivo aggiunto dinamicamente\" src=\"/it/4.2/_images/admin14t.png\" />\n<p>Un piccolo problema. Occupa molto spazio dello schermo mostrare tutti i campi per inserire i relativi oggetti <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>. Per questo motivo, Django offre un modo tabellare per mostrare i relativi oggetti inline. Per usarlo, cambia la dichiarazione <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceInline</span></code> per leggere:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">TabularInline</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></figure>\n<p>Con questa  <code class=\"docutils literal notranslate\"><span class=\"pre\">TabularInline</span></code> (invece di <code class=\"docutils literal notranslate\"><span class=\"pre\">StackedInline</span></code>), gli oggetti relativi vengono mostrati in un modo più compatto, in un formato tabellare:</p>\n<img alt=\"La pagina per l'aggiunta di una domanda ora ha scelte più compatte\" src=\"/it/4.2/_images/admin11t.png\" />\n<p>Nota che è presente una ulteriore colonna «Cancellare?» che permette di rimuovere le righe aggiunte con il pulsante «Aggiungi un’altra scelta» e le righe che sono già state salvate.</p>\n</section>\n<section id=\"customize-the-admin-change-list\">\n<h2>Personalizzazione della lista per la modifica dell’interfaccia di amministrazione<a class=\"heading-anchor\" href=\"#customize-the-admin-change-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ora che la pagina di amministrazione del modello Question sembra buona, facciamo qualche modifica alla pagina di «change list» – quella che mostra tutte le domande nel sistema.</p>\n<p>Ecco come appare a questo punto:</p>\n<img alt=\"Pagina della lista dei cambiamenti dei sondaggi\" src=\"/it/4.2/_images/admin04t.png\" />\n<p>Di default, Django mostra la <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> di ogni oggetto. Qualche volta però può essere più utile se potessimo mostrare campi individuali. Per fare questo, usa  l’opzione di amministrazione <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>, che è una tupla di nomi di campi da mostrare, come colonne, sulla pagina della lista dei cambiamenti per l’oggetto:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></figure>\n<p>Di buona norma, aggiungiamo il metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently()</span></code> da <a class=\"reference internal\" href=\"/it/4.2/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;was_published_recently&quot;</span><span class=\"p\">]</span>\n</code></pre></figure>\n<p>Ora la pagina di elenco delle domande ha questo aspetto:</p>\n<img alt=\"La pagina dei cambiamenti relativi ai sondaggi, aggiornata\" src=\"/it/4.2/_images/admin12t.png\" />\n<p>Puoi fare click sull’intestazione delle colonne per ordinare quei valori – eccetto nel caso di <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code> perchè l’ordinamento dell’output di un metodo non è supportato. Nota anche che l’intestazione di colonna per <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code> è, di default, il nome del metodo (con gli underscore a rimpiazzare gli spazi), e che ogni linea contiene la rappresentazione in stringa dell’oggetto.</p>\n<p>Puoi migliorarlo usando il decoratore <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">display()</span></code></a> su quel metodo (in <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code>), come segue:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">display</span><span class=\"p\">(</span>\n        <span class=\"n\">boolean</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">ordering</span><span class=\"o\">=</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Published recently?&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">now</span> <span class=\"o\">-</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"o\">&lt;=</span> <span class=\"n\">now</span>\n</code></pre></figure>\n<p>Per più informazioni sulle proprietà configurabili attraverso il decoratore, vedi <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>.</p>\n<p>Modifica nuovamente il tuo file <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code> e aggiungi un miglioramento alla pagina dell’elenco di modifiche <code class=\"docutils literal notranslate\"><span class=\"pre\">Domanda</span></code>: i filtri usando <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_filter</span></code></a>. Aggiungi la seguente riga in <code class=\"docutils literal notranslate\"><span class=\"pre\">QuestionAdmin</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Questo aggiunge una sidebar «Filtra» che permette all’utente di filtrare la lista per il campo <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code>:</p>\n<img alt=\"La pagina dei cambiamenti relativi ai sondaggi, aggiornata\" src=\"/it/4.2/_images/admin13t.png\" />\n<p>Il tipo di filtro visualizzato dipende dal tipo di campo su cui stai filtrando. Poiché <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> è un <a class=\"reference internal\" href=\"/it/4.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a>, Django sa fornire le opzioni di filtro appropriate: «Qualsiasi data», «Oggi», «Ultimi 7 giorni», «Questo mese», «Quest’anno».</p>\n<p>Sta venendo su bene. Aggiungiamo alcune funzionalità di ricerca:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">search_fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Ciò aggiunge una casella di ricerca all’inizio dell’elenco delle modifiche. Quando qualcuno inserisce i termini di ricerca, Django cercherà nel campo <code class=\"docutils literal notranslate\"><span class=\"pre\">question_text</span></code>. Puoi utilizzare tutti i campi che desideri – anche se poiché utilizza una query <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> dietro le quinte, limitare il numero di campi di ricerca a un numero ragionevole renderà più facile per il tuo database fare la ricerca.</p>\n<p>Adesso è anche un buon momento per notare che le liste dei cambiamenti ti danno la paginazione gratis. Di default, mostra 100 elementi per pagina. <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_per_page\" title=\"django.contrib.admin.ModelAdmin.list_per_page\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Change</span> <span class=\"pre\">list</span> <span class=\"pre\">pagination</span></code></a>, <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">search</span> <span class=\"pre\">boxes</span></code></a>, <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">filters</span></code></a>, <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy\" title=\"django.contrib.admin.ModelAdmin.date_hierarchy\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">date-hierarchies</span></code></a>, e <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">column-header-ordering</span></code></a> lavorano tutti assieme come pensi che dovrebbero.</p>\n</section>\n<section id=\"customize-the-admin-look-and-feel\">\n<h2>Personalizza l’aspetto dell’amministrazione<a class=\"heading-anchor\" href=\"#customize-the-admin-look-and-feel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Chiaramente, avere «Django administration» nella parte superiore di ogni pagina di amministrazione è ridicolo. È solo testo segnaposto.</p>\n<p>Puoi comunque cambiarlo, usando il sistema di template di Django. L’admin di Django è costruita su Django stesso, e dunque le sue interfacce usano il sistema di template di Django.</p>\n<section id=\"customizing-your-project-s-templates\">\n<span id=\"ref-customizing-your-projects-templates\"></span><h3>Personalizzare i template del tuo <em>progetto</em><a class=\"heading-anchor\" href=\"#customizing-your-project-s-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Crea una directory <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> nella directory del tuo progetto (quella che contiene <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>). I modelli possono risedere ovunque sul tuo filesystem purché Django vi possa accedere. (Django viene eseguito come qualsiasi utente venga eseguito dal server.) Tuttavia, mantenere i modelli all’interno del progetto è una buona convenzione da seguire.</p>\n<p>Apri il tuo file delle impostazioni (<code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>, ricorda) e aggiungi un’opzione <a class=\"reference internal\" href=\"/it/4.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> nell’impostazione <a class=\"reference internal\" href=\"/it/4.2/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.template.backends.django.DjangoTemplates&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;DIRS&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">BASE_DIR</span> <span class=\"o\">/</span> <span class=\"s2\">&quot;templates&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;APP_DIRS&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;context_processors&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                <span class=\"s2\">&quot;django.template.context_processors.debug&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.template.context_processors.request&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.contrib.auth.context_processors.auth&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.contrib.messages.context_processors.messages&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p><a class=\"reference internal\" href=\"/it/4.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> è una lista di directory su disco da controllare quando si caricano i template di Django; è un percorso di ricerca.</p>\n<aside class=\"admonition-organizing-templates admonition\">\n<p class=\"admonition-title\">Organizzazione dei template</p>\n<p>Proprio come i file statici, <em>potremmo</em> avere tutti i nostri modelli insieme, in una grande directory di modelli, e funzionerebbe perfettamente. Tuttavia, i modelli che appartengono a una particolare applicazione dovrebbero essere collocati nella directory dei modelli dell’applicazione(es. <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code>) piuttosto che in quelli del progetto (<code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code>). Discuteremo più in dettaglio nel <a class=\"reference internal\" href=\"/it/4.2/intro/reusable-apps/\"><span class=\"doc\">reusable apps tutorial</span></a>  <em>perché</em> lo facciamo.</p>\n</aside>\n<p>Now create a directory called <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> inside <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code>, and copy the\ntemplate <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> from within the default Django admin\ntemplate directory in the source code of Django itself\n(<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/4.2.x/django/contrib/admin/templates\">django/contrib/admin/templates</a>) into that directory.</p>\n<aside class=\"admonition-where-are-the-django-source-files admonition\">\n<p class=\"admonition-title\">Dove sono i file sorgenti di Django?</p>\n<p>Se hai difficoltà a trovare dove si trovano i file sorgente di Django sul tuo sistema, esegui il seguente comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-c<span class=\"w\"> </span><span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -c <span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div></div></div>\n</aside>\n<p>Quindi, modifica il file e sostituisci <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site_header|default:_('Django</span> <span class=\"pre\">administration')</span> <span class=\"pre\">}}</span></code> (comprese le parentesi graffe) con il nome del tuo sito come meglio credi. Dovresti finire con una sezione di codice tipo:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">branding</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;site-name&quot;</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;admin:index&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Polls Administration<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Usiamo questo approccio per insegnarti come sovrascrivere i modelli. In un progetto reale, probabilmente useresti l’attributo: <a class=\"reference internal\" href=\"/it/4.2/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header\" title=\"django.contrib.admin.AdminSite.site_header\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.AdminSite.site_header</span></code></a> per realizzare più facilmente questa particolare personalizzazione.</p>\n<p>Questo file di template contiene molto testo come <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">branding</span> <span class=\"pre\">%}</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">title</span> <span class=\"pre\">}}</span></code>. I tag <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span></code> sono parte del linguaggio di template di Django. Quando Django mostra <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code>, questo linguaggio di template sarà valutato per produrre la pagina HTML finale, come abbiamo visto in <a class=\"reference internal\" href=\"/it/4.2/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>.</p>\n<p>Nota che qualsiasi template predefinito del pannello di amministrazione di Django può essere sovrascritto. Per sovrascrivere un template, fai la stessa cosa che hai fatto con <code class=\"docutils literal notranslate\"><span class=\"pre\">base_site.html</span></code> – copialo dalla directory predefinita nella tua directory personalizzata e apporta le modifiche.</p>\n</section>\n<section id=\"customizing-your-application-s-templates\">\n<h3>Personalizzare i template della tua <em>applicazione</em><a class=\"heading-anchor\" href=\"#customizing-your-application-s-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>I lettori più attenti chiederanno: Ma se: l’impostazione: DIRS &lt;TEMPLATES-DIRS&gt; era vuota per impostazione predefinita, come ha fatto Django a trovare i modelli di amministrazione predefiniti? La risposta è che, poiché <a class=\"reference internal\" href=\"/it/4.2/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a>  è impostato su <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, Django cerca automaticamente una sottodirectory <code class=\"docutils literal notranslate\"><span class=\"pre\">templates/</span></code> all’interno di ogni pacchetto dell’applicazione, da usare come fallback (non dimenticare che <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code> è un’applicazione).</p>\n<p>La nostra applicazione per i sondaggi non è molto complessa e non necessita di modelli di admin personalizzati. Ma se diventasse più sofisticato e richiedesse la modifica dei modelli di amministrazione standard di Django per alcune delle sue funzionalità, sarebbe più sensato modificare i modelli <em>nell’applicazione</em>, piuttosto che quelli nel <em>progetto</em>. In questo modo, potresti includere l’applicazione sondaggi in qualsiasi nuovo progetto e avere la certezza che troverà i modelli personalizzati di cui ha bisogno.</p>\n<p>Vedi la <a class=\"reference internal\" href=\"/it/4.2/topics/templates/#template-loading\"><span class=\"std std-ref\">documentazione sul caricamento dei template</span></a> per ulteriori informazioni su come Django trova i suoi template.</p>\n</section>\n</section>\n<section id=\"customize-the-admin-index-page\">\n<h2>Personalizza l’indice dell’amministrazione<a class=\"heading-anchor\" href=\"#customize-the-admin-index-page\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>In modo simile, potresti voler personalizzare l’aspetto della pagina dell’indice di amministrazione di Django.</p>\n<p>Di default, mostra tutte le app in <a class=\"reference internal\" href=\"/it/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> che sono state registrate con l’applicazione di admin, in ordine alfabetico. Potresti voler apportare modifiche significative al layout. Dopotutto, l’indice è probabilmente la pagina più importante dell’amministratore e dovrebbe essere facile da usare.</p>\n<p>Il modello da personalizzare è <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/index.html</span></code>. (Fai lo stesso di <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> nella sezione precedente - copialo dalla directory predefinita alla directory del tuo modello personalizzato). Modifica il file e vedrai che utilizza una variabile di modello chiamata <code class=\"docutils literal notranslate\"><span class=\"pre\">app_list</span></code>. Quella variabile contiene tutte le app Django installate. Invece di usarlo, puoi codificare link a pagine di amministrazione specifiche degli oggetti nel modo che ritieni migliore.</p>\n<p>When you’re comfortable with the admin, read <a class=\"reference internal\" href=\"/it/4.2/intro/tutorial08/\"><span class=\"doc\">part 8 of this\ntutorial</span></a> to learn how to use third-party packages.</p>\n</section>","rootId":"writing-your-first-django-app-part-7","toc":[{"title":"Personalizzare il modulo di amministrazione","anchor":"customize-the-admin-form","children":[]},{"title":"Aggiunta di oggetti correlati","anchor":"adding-related-objects","children":[]},{"title":"Personalizzazione della lista per la modifica dell’interfaccia di amministrazione","anchor":"customize-the-admin-change-list","children":[]},{"title":"Personalizza l’aspetto dell’amministrazione","anchor":"customize-the-admin-look-and-feel","children":[{"title":"Personalizzare i template del tuo progetto","anchor":"customizing-your-project-s-templates","children":[]},{"title":"Personalizzare i template della tua applicazione","anchor":"customizing-your-application-s-templates","children":[]}]},{"title":"Personalizza l’indice dell’amministrazione","anchor":"customize-the-admin-index-page","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Come iniziare","url":"/it/4.2/intro/"}],"prev":{"docname":"intro/tutorial06","title":"Scrivere la tua prima applicazione in Django, parte 6","url":"/it/4.2/intro/tutorial06/"},"next":{"docname":"intro/tutorial08","title":"Writing your first Django app, part 8","url":"/it/4.2/intro/tutorial08/"},"formats":{"html":"/it/4.2/intro/tutorial07/","markdown":"/it/4.2/intro/tutorial07.md","json":"/it/4.2/intro/tutorial07.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/intro/tutorial07.txt","official":"https://docs.djangoproject.com/it/4.2/intro/tutorial07/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}