### Arborescence du projet `{project_name}`
```
{project_name}/
■■■ .env
■■■ .gitignore
■■■ config/
■ ■■■ __init__.py
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ settings/
■ ■ ■■■ __init__.py
■ ■ ■■■ [Link]
■ ■ ■■■ [Link]
■ ■ ■■■ [Link]
■ ■■■ [Link]
■■■ apps/
■ ■■■ accounts/
■ ■■■ __init__.py
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ templates/
■ ■■■ accounts/
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ [Link]
■ ■■■ password_reset.html
■ ■■■ password_reset_confirm.html
■ ■■■ [Link]
■■■ [Link]
■■■ Pipfile
■■■ [Link]
■■■ Dockerfile
■■■ [Link]
■■■ .github/
■■■ workflows/
■■■ [Link]
```
## 1. Fichier de démarrage : `[Link]`
```python
#!/usr/bin/env python
import os
import sys
def main():
[Link]('DJANGO_SETTINGS_MODULE', '[Link]')
try:
from [Link] import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django."
) from exc
execute_from_command_line([Link])
if __name__ == '__main__':
main()
```
## 2. ASGI et WSGI
### `config/[Link]`
```python
import os
from [Link] import get_asgi_application
[Link]('DJANGO_SETTINGS_MODULE', '[Link]')
application = get_asgi_application()
```
### `config/[Link]`
```python
import os
from [Link] import get_wsgi_application
[Link]('DJANGO_SETTINGS_MODULE', '[Link]')
application = get_wsgi_application()
```
## 3. Fichiers restants
### `config/settings/[Link]`
```python
from pathlib import Path
import environ
env = [Link]()
[Link].read_env()
BASE_DIR = Path(__file__).resolve().[Link]
SECRET_KEY = env("SECRET_KEY")
DEBUG = [Link]("DEBUG", default=True)
ALLOWED_HOSTS = [Link]("ALLOWED_HOSTS", default=[])
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
]
MIDDLEWARE = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
]
ROOT_URLCONF = '[Link]'
TEMPLATES = [
{
'BACKEND': '[Link]',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'[Link].context_processors.debug',
'[Link].context_processors.request',
'[Link].context_processors.auth',
'[Link].context_processors.messages',
],
},
},
]
WSGI_APPLICATION = '[Link]'
DATABASES = {
'default': [Link](),
}
AUTH_PASSWORD_VALIDATORS = [
{'NAME': '[Link].password_validation.UserAttributeSimilarityValidator'},
{'NAME': '[Link].password_validation.MinimumLengthValidator'},
{'NAME': '[Link].password_validation.CommonPasswordValidator'},
{'NAME': '[Link].password_validation.NumericPasswordValidator'},
]
LANGUAGE_CODE = 'fr-fr'
TIME_ZONE = 'Africa/Douala'
USE_I18N = True
USE_TZ = True
STATIC_URL = 'static/'
DEFAULT_AUTO_FIELD = '[Link]'
AUTH_USER_MODEL = '[Link]'
```
### `apps/accounts/[Link]`
```python
from [Link] import AbstractUser
from [Link] import models
class User(AbstractUser):
bio = [Link](blank=True)
avatar = [Link](upload_to='avatars/', blank=True, null=True)
```
### `apps/accounts/[Link]`
```python
from django import forms
from [Link] import UserCreationForm, AuthenticationForm
from .models import User
class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
class LoginForm(AuthenticationForm):
pass
class ProfileForm([Link]):
class Meta:
model = User
fields = ('bio', 'avatar')
```
### `apps/accounts/[Link]`
```python
from [Link] import login, logout
from [Link] import LoginView, LogoutView, PasswordResetView,
PasswordResetConfirmView
from [Link] import reverse_lazy
from [Link] import CreateView, UpdateView
from .forms import SignUpForm, ProfileForm
from .models import User
from [Link] import LoginRequiredMixin
class SignUpView(CreateView):
form_class = SignUpForm
success_url = reverse_lazy('login')
template_name = 'accounts/[Link]'
class ProfileView(LoginRequiredMixin, UpdateView):
model = User
form_class = ProfileForm
template_name = 'accounts/[Link]'
success_url = reverse_lazy('profile')
def get_object(self):
return [Link]
```
### `apps/accounts/[Link]`
```python
from [Link] import path
from [Link] import views as auth_views
from .views import SignUpView, ProfileView
urlpatterns = [
path('signup/', SignUpView.as_view(), name='signup'),
path('login/', auth_views.LoginView.as_view(template_name='accounts/[Link]'),
name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('password_reset/', auth_views.PasswordResetView.as_view(
template_name='accounts/password_reset.html',
email_template_name='accounts/password_reset_email.html',
subject_template_name='accounts/password_reset_subject.txt',
success_url='done/'
), name='password_reset'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(
template_name='accounts/password_reset_done.html'
), name='password_reset_done'),
path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
template_name='accounts/password_reset_confirm.html',
success_url='/accounts/reset/complete/'
), name='password_reset_confirm'),
path('reset/complete/', auth_views.PasswordResetCompleteView.as_view(
template_name='accounts/password_reset_complete.html'
), name='password_reset_complete'),
path('profile/', ProfileView.as_view(), name='profile'),
]
```
### Templates vitrine et supplémentaires
(Templates `[Link]`, `[Link]`, `[Link]`, `[Link]`, `[Link]`,
`[Link]`)