Comment importer des URL à partir d'applications dans le fichier d'URL principal de Django

Dec 01 2020

J'ai la structure de projet suivante.

Ceci est mon tableau INSTALLED_APPS.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'climemanage.clients'
]

Ensuite, j'ai essayé d'ajouter le clients.urlsfichier dans le urlsfichier parent comme ci-dessous.

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('clients/', include('clients.urls'))
]

Mais j'obtiens cette erreur. ModuleNotFoundError: No module named 'clients'

Je peux résoudre ce problème en utilisant le chemin suivant. include('climemanage.clients.urls')mais je veux sauter climemanagedu chemin.

J'ai essayé différentes manières comme,

import clients
import climemanage.clients
from climemanage import clients

Mais rien ne fonctionne.

Réponses

1 ha-neul Dec 01 2020 at 13:51

La structure de votre projet est erronée. Il semble startprojectqu'une partie ou une startapppartie ait mal tourné. Ce serait peut-être mieux si vous pouviez énumérer comment vous vous êtes rendu à ce point. Veuillez voir la structure que j'ai mise à la fin de ma réponse.

Dans votre cas, votre principal settings.pyest sous clients. Cela signifie que clientsc'est le résultat de startproject. Actuellement, vous n'en avez pas app, mais vous avez un tas de fichiers qui devraient apparaître avec appcelui-ci maintenant sous le migrationsdossier.

À cause de cela, vous ne pourrez jamais ajouter quoi que ce soit de clients.urlsà principal urls.py. Parce que vous clientsêtes l'endroit où se trouve votre principal urls.py.

Je mets ce que je fais normalement ici (cette version mac, si vous utilisez Windows, vous devez vérifier le didacticiel django)

$ mkdir clienmanage $ cd clienmanage
$ python3 -m venv myvenv # set up virtual environment $ source myvenv/bin/activate  # go into virtual envionment
After this step you can install django

puis après cela, lorsque vous exécutez votre startprojectcommande, assurez-vous d'exécuter comme ci-dessous:

django-admin startproject project .

Notez le .à la fin.

Après cela, vous devriez avoir une structure comme:

clienmanage
|--- manage.py
|--- project
|   |--- __init__.py
|   |--- settings.py
|   |--- urls.py
|   |--- wsgi.py
|--- virtual
|
|___ requirements.txt

alors vous allez:

$ python manage.py startapp clients

clienmanage
|
|---clients # this is the app
|    |---migrations
|    |---models.py
|    |---views.py
|    |---apps.py  
|--- manage.py
|--- project
|   |--- __init__.py
|   |--- settings.py
|   |--- urls.py
|   |--- wsgi.py
|--- virtual # a folder
|
|___ requirements.txt

Après cette étape, django ne générera pas automatiquement le appniveau urls.pyet forms.py. Vous devez générer ces fichiers dans le appdossier (dans mon exemple de cas, clients)

**** Si vous souhaitez placer l'application dans un répertoire différent, vous pouvez spécifier la destination.

$ python manage.py startapp <app_label> [destination] 

dans le cas ci-dessus, si vous voulez avoir votre appintérieur deproject

$ python manage.py startapp clients project/clients

Si vous avez emprunté cette voie, assurez-vous d'ajouter project.clientsplutôt que clientsdans votre fichier INSTALLED_APPS.

Ashwathama Dec 01 2020 at 13:08

Dans le fichier principal urls.py, vous pouvez ajouter l'extrait de code suivant.

from django.urls import path, include 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('something/', include('clients.urls')),
]

Dans le fichier settings.py

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'webapi',  # like in my case my appname was webapi
 'nameofyourapp', #pay attention here
]
Skip_god Dec 01 2020 at 14:19

Montrez-moi votre page client.urls.py, s'il vous plaît.