{"title":"Avancerad handledning: Hur man skriver återanvändbara appar","version":"6.1","locale":"sv","docname":"intro/reusable-apps","url":"/sv/6.1/intro/reusable-apps/","canonical":"https://djangodocs.dev/sv/6.1/intro/reusable-apps/","summary":"Denna avancerade handledning börjar där Handledning 8 slutade. Vi kommer att förvandla vår webbenkät till ett fristående Python-paket som du kan återanvända…","html":"<h1>Avancerad handledning: Hur man skriver återanvändbara appar<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Denna avancerade handledning börjar där <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial08/\"><span class=\"doc\">Handledning 8</span></a> slutade. Vi kommer att förvandla vår webbenkät till ett fristående Python-paket som du kan återanvända i nya projekt och dela med andra människor.</p>\n<p>Om du inte nyligen har slutfört Tutorials 1-8, uppmanar vi dig att gå igenom dessa så att ditt exempelprojekt överensstämmer med det som beskrivs nedan.</p>\n<section id=\"reusability-matters\">\n<h2>Återanvändbarhet är viktigt<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det är mycket arbete att designa, bygga, testa och underhålla en webbapplikation. Många Python- och Django-projekt delar gemensamma problem. Skulle det inte vara bra om vi kunde spara en del av detta upprepade arbete?</p>\n<p>Återanvändbarhet är livsstilen i Python. <a class=\"reference external\" href=\"https://pypi.org/\">Python Package Index (PyPI)</a> har ett stort utbud av paket som du kan använda i dina egna Python-program. Kolla in <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> för befintliga återanvändbara appar som du kan införliva i ditt projekt. Django i sig är också ett normalt Python-paket. Det innebär att du kan ta befintliga Python-paket eller Django-appar och komponera dem till ditt eget webbprojekt. Du behöver bara skriva de delar som gör ditt projekt unikt.</p>\n<p>Låt oss säga att du startar ett nytt projekt som behöver en app för opinionsundersökningar, som den vi har arbetat med. Hur gör du den här appen återanvändbar? Lyckligtvis, du är på god väg redan. I <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a> såg vi hur vi kunde frikoppla polls från URLconf på projektnivå med hjälp av en <code class=\"docutils literal notranslate\">include</code>. I den här handledningen tar vi ytterligare steg för att göra appen enkel att använda i nya projekt och redo att publicera så att andra kan installera och använda den.</p>\n<aside class=\"admonition-package-app admonition\" role=\"note\">\n<p class=\"admonition-title\">Paket? App?</p>\n<p>En Python <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(in Python v3.14)\"><span class=\"xref std std-term\">package</span></a> ger ett sätt att gruppera relaterad Python-kod för enkel återanvändning. Ett paket innehåller en eller flera filer med Python-kod (även kända som ”moduler”).</p>\n<p>Ett paket kan importeras med <code class=\"docutils literal notranslate\">import foo.bar</code> eller <code class=\"docutils literal notranslate\">from foo import bar</code>. För att en katalog (som <code class=\"docutils literal notranslate\">polls</code>) ska utgöra ett paket måste den innehålla en speciell fil <code class=\"docutils literal notranslate\">__init__.py</code>, även om denna fil är tom.</p>\n<p>En Django <em>applikation</em> är ett Python-paket som är specifikt avsett för användning i ett Django-projekt. En applikation kan använda vanliga Django-konventioner, till exempel att ha undermoduler för <code class=\"docutils literal notranslate\">modeller</code>, <code class=\"docutils literal notranslate\">tester</code>, <code class=\"docutils literal notranslate\">urls</code> och <code class=\"docutils literal notranslate\">vyer</code>.</p>\n<p>Senare använder vi termen <em>packaging</em> för att beskriva processen att göra ett Python-paket enkelt för andra att installera. Vi vet att det kan vara lite förvirrande.</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>Ditt projekt och din återanvändbara app<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Efter de tidigare handledningarna bör vårt projekt se ut så här:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>djangotutorial/\n    manage.py\n    mysite/\n        __init__.py\n        settings.py\n        urls.py\n        asgi.py\n        wsgi.py\n    polls/\n        __init__.py\n        admin.py\n        apps.py\n        migrations/\n            __init__.py\n            0001_initial.py\n        models.py\n        static/\n            polls/\n                images/\n                    background.png\n                style.css\n        templates/\n            polls/\n                detail.html\n                index.html\n                results.html\n        tests.py\n        urls.py\n        views.py\n    templates/\n        admin/\n            base_site.html\n</code></pre></div>\n<p>Du skapade <code class=\"docutils literal notranslate\">djangotutorial/templates</code> i <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a>, och <code class=\"docutils literal notranslate\">polls/templates</code> i <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>. Nu kanske det är tydligare varför vi valde att ha separata mallkataloger för projektet och applikationen: allt som är en del av pollsapplikationen finns i <code class=\"docutils literal notranslate\">polls</code>. Det gör applikationen fristående och lättare att släppa in i ett nytt projekt.</p>\n<p>Katalogen <code class=\"docutils literal notranslate\">polls</code> kan nu kopieras till ett nytt Django-projekt och omedelbart återanvändas. Den är dock inte riktigt redo att publiceras. För det måste vi paketera appen för att göra det enkelt för andra att installera den.</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>Installera vissa förutsättningar<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det nuvarande läget för Python-paketering är lite förvirrat med olika verktyg. För denna handledning kommer vi att använda <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> för att bygga vårt paket. Det är det rekommenderade förpackningsverktyget (sammanslaget med <code class=\"docutils literal notranslate\">distribute</code>-gaffeln). Vi kommer också att använda <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pip/\">pip</a> för att installera och avinstallera det. Du bör installera dessa två paket nu. Om du behöver hjälp kan du läsa <a class=\"reference internal\" href=\"/sv/6.1/topics/install/#installing-official-release\"><span class=\"std std-ref\">så här installerar du Django med pip</span></a>. Du kan installera <code class=\"docutils literal notranslate\">setuptools</code> på samma sätt.</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>Paketera din app<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python <em>packaging</em> hänvisar till att förbereda din app i ett specifikt format som enkelt kan installeras och användas. Django själv är förpackat mycket på detta sätt. För en liten app som polls är denna process inte alltför svår.</p>\n<ol class=\"arabic\">\n<li><p>Först skapar du en överordnad katalog för paketet, utanför ditt Django-projekt. Kalla den här katalogen <code class=\"docutils literal notranslate\">django-polls</code>.</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\" role=\"note\">\n<p class=\"admonition-title\">Välja ett namn för din app</p>\n<p>När du väljer ett namn för ditt paket, kontrollera PyPI för att undvika namnkonflikter med befintliga paket. Vi rekommenderar att du använder ett <code class=\"docutils literal notranslate\">django-</code>-prefix för paketnamn, för att identifiera ditt paket som specifikt för Django, och ett motsvarande <code class=\"docutils literal notranslate\">django_</code>-prefix för ditt modulnamn. Till exempel innehåller paketet <code class=\"docutils literal notranslate\">django-ratelimit</code> modulen <code class=\"docutils literal notranslate\">django_ratelimit</code>.</p>\n<p>Applikationsetiketter (det vill säga den sista delen av den prickade sökvägen till applikationspaket) <em>måste</em> vara unika i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>. Undvik att använda samma etikett som någon av Django <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/\"><span class=\"doc\">contrib-paketen</span></a>, till exempel <code class=\"docutils literal notranslate\">auth</code>, <code class=\"docutils literal notranslate\">admin</code> eller <code class=\"docutils literal notranslate\">messages</code>.</p>\n</aside>\n</li>\n<li><p>Flytta katalogen <code class=\"docutils literal notranslate\">polls</code> till katalogen <code class=\"docutils literal notranslate\">django-polls</code> och döp om den till <code class=\"docutils literal notranslate\">django_polls</code>.</p></li>\n<li><p>Redigera <code class=\"docutils literal notranslate\">django_polls/apps.py</code> så att <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\">name</code></a> refererar till det nya modulnamnet, lägg till <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.label\" title=\"django.apps.AppConfig.label\"><code class=\"xref py py-attr docutils literal notranslate\">label</code></a> för att ge appen ett kort namn och ange <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.default_auto_field\" title=\"django.apps.AppConfig.default_auto_field\"><code class=\"xref py py-attr docutils literal notranslate\">default_auto_field</code></a> för att säkerställa att dina migreringar inte påverkas av ändringar av <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> som görs av användare av din återanvändbara app:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">django-polls/django_polls/apps.py</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=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PollsConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    default_auto_field <span class=\"o\">=</span> <span class=\"s2\">&quot;django.db.models.BigAutoField&quot;</span>\n    name <span class=\"o\">=</span> <span class=\"s2\">&quot;django_polls&quot;</span>\n    label <span class=\"o\">=</span> <span class=\"s2\">&quot;polls&quot;</span>\n</code></pre></figure>\n</li>\n<li><p>Skapa en fil <code class=\"docutils literal notranslate\">django-polls/README.rst</code> med följande innehåll:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"rst\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">django-polls/README.rst</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">============</span>\n<span class=\"gh\">django-polls</span>\n<span class=\"gh\">============</span>\n\ndjango-polls is a Django app to conduct web-based polls. For each\nquestion, visitors can choose between a fixed number of answers.\n\nDetailed documentation is in the &quot;docs&quot; directory.\n\n<span class=\"gh\">Quick start</span>\n<span class=\"gh\">-----------</span>\n\n<span class=\"m\">1.</span> Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n<span class=\"c\">        ...,</span>\n<span class=\"c\">        &quot;django_polls&quot;,</span>\n<span class=\"c\">    ]</span>\n\n<span class=\"m\">2.</span> Include the polls URLconf in your project urls.py like this::\n\n    path(&quot;polls/&quot;, include(&quot;django_polls.urls&quot;)),\n\n<span class=\"m\">3.</span> Run <span class=\"s\">``python manage.py migrate``</span> to create the models.\n\n<span class=\"m\">4.</span> Start the development server and visit the admin to create a poll.\n\n<span class=\"m\">5.</span> Visit the <span class=\"s\">``/polls/``</span> URL to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p>Skapa en fil med namnet <code class=\"docutils literal notranslate\">django-polls/LICENSE</code>. Att välja en licens ligger utanför ramen för denna handledning, men det räcker med att säga att kod som släpps offentligt utan licens är <em>användbar</em>. Django och många Django-kompatibla appar distribueras under BSD-licensen; du är dock fri att välja din egen licens. Var bara medveten om att ditt licensval kommer att påverka vem som kan använda din kod.</p></li>\n<li><p>Därefter skapar vi filen <code class=\"docutils literal notranslate\">pyproject.toml</code> som beskriver hur appen ska byggas och installeras. En fullständig förklaring av den här filen ligger utanför ramen för denna handledning, men <a class=\"reference external\" href=\"https://packaging.python.org/guides/writing-pyproject-toml/\">Python Packaging User Guide</a> har en bra förklaring. Skapa filen <code class=\"docutils literal notranslate\">django-polls/pyproject.toml</code> med följande innehåll:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"toml\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">django-polls/pyproject.toml</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Toml</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=\"Toml code\"><code><span class=\"k\">[build-system]</span>\nrequires <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;setuptools&gt;83&quot;</span><span class=\"p\">]</span>\nbuild-backend <span class=\"o\">=</span> <span class=\"s2\">&quot;setuptools.build_meta&quot;</span>\n\n<span class=\"k\">[project]</span>\nname <span class=\"o\">=</span> <span class=\"s2\">&quot;django-polls&quot;</span>\nversion <span class=\"o\">=</span> <span class=\"s2\">&quot;0.1&quot;</span>\ndependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django&gt;=X.Y&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"p\">]</span>\ndescription <span class=\"o\">=</span> <span class=\"s2\">&quot;A Django app to conduct web-based polls.&quot;</span>\nreadme <span class=\"o\">=</span> <span class=\"s2\">&quot;README.rst&quot;</span>\nlicense <span class=\"o\">=</span> <span class=\"s2\">&quot;BSD-3-Clause&quot;</span>\nrequires-python <span class=\"o\">=</span> <span class=\"s2\">&quot;&gt;= 3.12&quot;</span>\nauthors <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>name <span class=\"p\">=</span> <span class=\"s2\">&quot;Your Name&quot;</span><span class=\"p\">,</span> email <span class=\"p\">=</span> <span class=\"s2\">&quot;yourname@example.com&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">]</span>\nclassifiers <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;Environment :: Web Environment&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Framework :: Django&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Framework :: Django :: X.Y&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n    <span class=\"s2\">&quot;Intended Audience :: Developers&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Operating System :: OS Independent&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Programming Language :: Python&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Programming Language :: Python :: 3&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Programming Language :: Python :: 3 :: Only&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Programming Language :: Python :: 3.12&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Programming Language :: Python :: 3.13&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Programming Language :: Python :: 3.14&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Topic :: Internet :: WWW/HTTP&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;Topic :: Internet :: WWW/HTTP :: Dynamic Content&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n\n<span class=\"k\">[project.urls]</span>\nHomepage <span class=\"o\">=</span> <span class=\"s2\">&quot;https://www.example.com/&quot;</span>\n</code></pre></figure>\n</li>\n<li><p>Många vanliga filer och Python-moduler och -paket ingår i paketet som standard. För att inkludera ytterligare filer måste vi skapa en fil <code class=\"docutils literal notranslate\">MANIFEST.in</code>. För att inkludera mallarna och de statiska filerna skapar du en fil <code class=\"docutils literal notranslate\">django-polls/MANIFEST.in</code> med följande innehåll:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">django-polls/MANIFEST.in</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>recursive-include django_polls/static *\nrecursive-include django_polls/templates *\n</code></pre></figure>\n</li>\n<li><p>Det är valfritt, men rekommenderas, att inkludera detaljerad dokumentation med din app. Skapa en tom katalog <code class=\"docutils literal notranslate\">django-polls/docs</code> för framtida dokumentation.</p>\n<p>Observera att katalogen <code class=\"docutils literal notranslate\">docs</code> inte kommer att ingå i ditt paket om du inte lägger till några filer i den. Många Django-appar tillhandahåller också sin dokumentation online via webbplatser som <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a>.</p>\n<p>Många Python-projekt, inklusive Django och Python självt, använder <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/quickstart.html\">Sphinx</a> för att bygga sin dokumentation. Om du väljer att använda Sphinx kan du länka tillbaka till Djangos dokumentation genom att konfigurera <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/quickstart.html#intersphinx\">Intersphinx</a> och inkludera ett värde för Django i ditt projekts <code class=\"docutils literal notranslate\">intersphinx_mapping</code> värde:</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>intersphinx_mapping <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;https://docs.djangoproject.com/en/stable/&quot;</span><span class=\"p\">,</span>\n        <span class=\"kc\">None</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Med det på plats kan du sedan korslänka till specifika poster, på samma sätt som i Django-dokumenten, till exempel ”<code class=\"docutils literal notranslate\">:attr:`django.test.TransactionTestCase.databases</code>”.</p>\n</li>\n<li><p>Kontrollera att paketet <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/build/\">build</a> är installerat (<code class=\"docutils literal notranslate\">python -m pip install build</code>) och försök bygga ditt paket genom att köra <code class=\"docutils literal notranslate\">python -m build</code> inuti <code class=\"docutils literal notranslate\">django-polls</code>. Detta skapar en katalog som heter <code class=\"docutils literal notranslate\">dist</code> och bygger ditt nya paket till källkods- och binärformat, <code class=\"docutils literal notranslate\">django_polls-0.1.tar.gz</code> och <code class=\"docutils literal notranslate\">django_polls-0.1-py3-none-any.whl</code>.</p></li>\n</ol>\n<p>Mer information om paketering finns i Pythons <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutorial on Packaging and Distributing Projects</a>.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>Använda ditt eget paket<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Eftersom vi flyttade katalogen <code class=\"docutils literal notranslate\">polls</code> ut ur projektet fungerar den inte längre. Vi ska nu åtgärda detta genom att installera vårt nya paket <code class=\"docutils literal notranslate\">django-polls</code>.</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\" role=\"note\">\n<p class=\"admonition-title\">Installera som ett användarbibliotek</p>\n<p>Följande steg installerar <code class=\"docutils literal notranslate\">django-polls</code> som ett användarbibliotek. Installationer per användare har många fördelar jämfört med att installera paketet i hela systemet, till exempel att det kan användas på system där du inte har administratörsbehörighet samt att förhindra att paketet påverkar systemtjänster och andra användare av maskinen.</p>\n<p>Observera att installationer per användare fortfarande kan påverka beteendet hos systemverktyg som körs som den användaren, så att använda en virtuell miljö är en mer robust lösning (se nedan).</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>För att installera paketet använder du pip (du har redan <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">installerat det</span></a>, eller hur?):</p>\n<div class=\"code-block\" data-language=\"shell\"><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>python -m pip install --user django-polls/dist/django_polls-0.1.tar.gz\n</code></pre></div>\n</li>\n<li><p>Uppdatera <code class=\"docutils literal notranslate\">mysite/settings.py</code> för att peka på det nya modulnamnet:</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>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django_polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Uppdatera <code class=\"docutils literal notranslate\">mysite/urls.py</code> för att peka på det nya modulnamnet:</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>urlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;polls/&quot;</span><span class=\"p\">,</span> include<span class=\"p\">(</span><span class=\"s2\">&quot;django_polls.urls&quot;</span><span class=\"p\">)),</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Kör utvecklingsservern för att bekräfta att projektet fortsätter att fungera.</p></li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>Publicera din app<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nu när vi har paketerat och testat <code class=\"docutils literal notranslate\">django-polls</code>, är det redo att dela med sig till världen! Om detta inte bara var ett exempel, kan du nu:</p>\n<ul class=\"simple\">\n<li><p>Skicka paketet till en vän via e-post.</p></li>\n<li><p>Ladda upp paketet på din webbplats.</p></li>\n<li><p>Publicera paketet på ett offentligt arkiv, som <a class=\"reference internal\" href=\"#the-python-package-index-pypi\">the Python Package Index (PyPI)</a>. Det finns <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">en bra handledning</a> för hur du gör detta.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-a-virtual-environment\">\n<h2>Installera Python-paket med en virtuell miljö<a class=\"heading-anchor\" href=\"#installing-python-packages-with-a-virtual-environment\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tidigare installerade vi <code class=\"docutils literal notranslate\">django-polls</code> som ett användarbibliotek. Detta har några nackdelar:</p>\n<ul class=\"simple\">\n<li><p>Om du ändrar användarbiblioteken kan det påverka andra Python-program på ditt system.</p></li>\n<li><p>Du kommer inte att kunna köra flera versioner av det här paketet (eller andra med samma namn).</p></li>\n</ul>\n<p>Vanligtvis uppstår dessa situationer först när du underhåller flera Django-projekt. När de gör det är den bästa lösningen att använda <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/venv.html\" title=\"(in Python v3.14)\"><span class=\"xref std std-doc\">venv</span></a>. Med det här verktyget kan du underhålla flera isolerade Python-miljöer, var och en med sin egen kopia av biblioteken och paketnamnrymden.</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"Återanvändbarhet är viktigt","anchor":"reusability-matters","children":[]},{"title":"Ditt projekt och din återanvändbara app","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"Installera vissa förutsättningar","anchor":"installing-some-prerequisites","children":[]},{"title":"Paketera din app","anchor":"packaging-your-app","children":[]},{"title":"Använda ditt eget paket","anchor":"using-your-own-package","children":[]},{"title":"Publicera din app","anchor":"publishing-your-app","children":[]},{"title":"Installera Python-paket med en virtuell miljö","anchor":"installing-python-packages-with-a-virtual-environment","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Kom igång","url":"/sv/6.1/intro/"}],"prev":{"docname":"intro/tutorial08","title":"Skriva din första Django-app, del 8","url":"/sv/6.1/intro/tutorial08/"},"next":{"docname":"intro/whatsnext","title":"Vad ska jag läsa härnäst?","url":"/sv/6.1/intro/whatsnext/"},"formats":{"html":"/sv/6.1/intro/reusable-apps/","markdown":"/sv/6.1/intro/reusable-apps.md","json":"/sv/6.1/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/sv/6.1/intro/reusable-apps/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}