Как лучше всего расширить модель User с помощью дополнительных полей в Django?

Нужна помощь или ресурсы для моделей Django.

Здравствуйте, Я пытаюсь модифицировать/расширить класс django.contrib.auth.models.User, чтобы он мог регистрировать еще несколько полей, помимо username и password. На данный момент я реализовал класс User только как внешний ключ в другом классе Task.

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Task(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) # cascade deletes all tasks/items when user is deleted
    title = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    complete = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self) :
        return self.title

    
    class Meta:
        ordering = ['complete']

Что я пробовал:

Я пробовал сделать это отношение один-к-одному с классом Employee, но все стало немного запутанным, так как от меня требовалось сначала зарегистрировать пользователя, а затем добавить атрибуты к Employee, а также выбрать (уже созданный) User в качестве первичного ключа. Это было непрактично, я полагаю.

Итак, мой вопрос таков:

Каким образом лучше всего добавить такие атрибуты как Email, ID номер, Имя, Фамилия и т.д. в класс User и как реализовать/вывести соответствующую форму в views.py?

Вот мой файл views.py:

from django.contrib.auth.mixins import LoginRequiredMixin   # settings.py modification requried as following:
                                                            # add line: LOGIN_URL = 'login' above STATIC_URL field on line 120

from django.contrib.auth.forms import UserCreationForm      # for registration
from django.contrib.auth import login

from .models import Task

# Create your views here.
class CustomLoginView(LoginView):
    template_name = 'base/login.html'
    fields = '__all__'
    redirect_authenticated_user = True

    def get_success_url(self):           
        return reverse_lazy('tasks')    # Redirects to the homepage


class RegisterPage(FormView):
    template_name = 'base/register.html'
    form_class = UserCreationForm
    redirect_authenticated_user = True 
    success_url = reverse_lazy('tasks')

    def form_valid(self, form):
        user = form.save()
        if user is not None:
            login(self.request, user)
        return super(RegisterPage, self).form_valid(form)

    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated:
            return redirect('tasks')
        
        return super(RegisterPage, self).get(*args, **kwargs)


class TaskList(LoginRequiredMixin ,ListView):
    model = Task 
    context_object_name = 'tasks'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tasks'] = context['tasks'].filter(user=self.request.user)    # returns tasks from that user o.O
        context['count'] = context['tasks'].filter(complete=False).count()

        search_input = self.request.GET.get('search-area') or ''
        if search_input:
            context['tasks'] = context['tasks'].filter(title__icontains=search_input)

        context['search_input'] = search_input

        return context


class TaskDetail(LoginRequiredMixin, DetailView):      # LoginRequiredMixin has to be added for security
    model = Task 
    context_object_name = 'task'
    template_name = 'base/task.html'


class TaskCreate(LoginRequiredMixin, CreateView):
    model = Task
    fields = ['title', 'description', 'complete']
    success_url = reverse_lazy('tasks')

    def form_valid(self, form):
        form.instance.user = self.request.user 
        return super(TaskCreate, self).form_valid(form)


class TaskUpdate(LoginRequiredMixin, UpdateView):
    model = Task
    fields = ['title', 'description', 'complete']
    success_url = reverse_lazy('tasks')


class TaskDelete(LoginRequiredMixin, DeleteView):
    model = Task
    context_object_name = 'task'
    success_url = reverse_lazy('tasks')
<
.
├── base
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0002_user.py
│   │   ├── 0003_delete_user.py
│   │   └── __init__.py
│   ├── models.py
│   ├── templates
│   │   └── base
│   │       ├── login.html
│   │       ├── register.html
│   │       ├── task.html
│   │       ├── task_confirm_delete.html
│   │       ├── task_form.html
│   │       └── task_list.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
└── todo_list
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
и моя файловая структура:

Заранее спасибо! :)

Вернуться на верх