Django вопрос по присвоению созданной новости/команды пользователю который создал ее

прошу помочь в одном вопросе, если это возможно.

У меня есть модель profile, которая имеет OneToOneField к User и есть поле team в модели Profile, так же есть модель Team с именем, тегом и т.д. Хотел бы спросить, как сделать так, чтобы пользователь, который создает команду, сразу же был в ней, чтобы полю team модели Profile присваивалась данная команда автоматически, чтобы он был ее создателем и капитаном сразу же. Может сможет кто помочь, объяснить, накидать банальный пример для понимания.

Создание сделал вот так, в отдельном приложении. Но не пойму как дать ъзеру созданную тиму.

models.py

from django.db import models
from django.contrib.auth.models import User
from slugify import slugify
from django.urls import reverse


class BaseModel(models.Model):
    objects = models.Manager()

    class Meta:
        abstract = True


class Profile(BaseModel):
    user = models.OneToOneField(
        User, on_delete=models.CASCADE, null=True, blank=True
    )
    nickname = models.CharField(max_length=30, unique=True, null=True)
    team = models.ForeignKey('Team', on_delete=models.SET_NULL, blank=True, null=True)

    def save(self, *args, **kwargs):
        super(self.__class__, self).save(*args, **kwargs)
        if self._state.adding is True:
            Profile.objects.create()

    def __str__(self):
        return self.nickname

    class Meta:
        verbose_name = "Автор"
        verbose_name_plural = "Авторы"


class Team(BaseModel):
    name = models.CharField('Название', max_length=50)
    tag = models.CharField('Тег', max_length=16, unique=True)
    slug = models.SlugField(unique=True, blank=True, null=True)

    def __str__(self):
        return f'{self.name} [{self.tag}]'

    def get_absolute_url(self):
        return reverse("team_detail", kwargs={"slug": self.slug})

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Team, self).save(*args, **kwargs)

    class Meta:
        verbose_name = "Команда"
        verbose_name_plural = "Команды"

forms.py

from django import forms
from django.contrib.auth.models import User
from django.forms import TextInput, Textarea, FileInput, IntegerField
from django.forms import TextInput, Textarea, FileInput, Select

from .models import *


class CreateTeamForm(forms.ModelForm):
    class Meta:
        model = Team
        fields = {
            'name', 'tag', 'slug'
        }

views.py

from django.conf import settings
from django.contrib.auth import authenticate, login, get_user_model
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.shortcuts import render, redirect, resolve_url
from django.utils.http import url_has_allowed_host_and_scheme
from django.views.generic.base import View
from django.views.generic import DetailView, ListView
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.decorators.csrf import csrf_exempt

from .models import *
from .forms import *


# Create your views here.


class CreateTeam(View):

    def get(self, request):
        form = CreateTeamForm(request.POST)
        context = {'form': form}
        return render(request, 'team/home.html', context)

    def post(self, request):
        if request.method == 'POST':
            form = CreateTeamForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('home')
            return redirect('home')

Только изучаю django, поэтому все сразу трудно реализовать, буду рад помощи.

НОВЫЙ КОД

forms.py

class JoinTeamForm(forms.ModelForm):
    key = forms.CharField(label='key', max_length=20)

    class Meta:
        model = Team
        fields = {'key'}

Я попробовал без key = forms.CharField(label='key', max_length=20), но в html {{ form.key }} не работал.

views.py

class JoinTeam(LoginRequiredMixin, View):

    def get(self, request, pk):
        print(f'post:{request.POST}, get:{request.GET}')
        form = JoinTeamForm(request.POST or None)
        team = Team.objects.get(id=pk)
        context = {'form': form,
                   'team': team
                   }
        return render(request, 'team/team_detail.html', context)

    def post(self, request, pk):
        print(f'post: {request.POST} team_id: {Team.objects.get(id=pk).key}')
        profile = request.user.profile
        error_msg = 'Неверный код'
        if request.method == 'POST':
            form = JoinTeamForm(request.POST)
            role = Role.objects.get(id=2)
            team = Team.objects.get(id=pk)
            if form.is_valid():
                key = form.save()
                if key == team.key:
                    profile.team = team
                    profile.role = role
                    profile.save()
                    return redirect(team.get_absolute_url())
                else:
                    return HttpResponse(error_msg)
            return redirect(team.get_absolute_url())

Вот так создаю команду и добавляю ключ, ключ хранится в новой модели привязывается к команду. Изначально ключ в модели команды держал, решил вынести в отдельную модель.

class CreateTeam(LoginRequiredMixin, View):

    def get(self, request, *args, **kwargs):
        form = CreateTeamForm(request.POST)
        context = {'form': form}
        return render(request, 'team/home.html', context)

    def post(self, request, *args, **kwargs):
        print(request.POST)
        profile = request.user.profile
        if request.method == 'POST':
            form = CreateTeamForm(request.POST)
            key_form = CreateKeyForm(request.POST)
            role = Role.objects.get(id=1)
            if form.is_valid():
                key = key_form.save(commit=False)
                # form = form.save(commit=False)
                # form.key = generate_alphanum_random_string(20)
                # form.save()
                team = form.save()
                key.team = team
                key.key = generate_alphanum_random_string(20)
                key.save()
                profile.team = team
                profile.role = role
                profile.save()
                return redirect('home')
            return redirect('home')

models.py

class Team(BaseModel):
    name = models.CharField('Название', max_length=50)
    tag = models.CharField('Тег', max_length=16, unique=True)
    # key = models.CharField('Код вступления', max_length=20, null=True, blank=True, unique=True)
    slug = models.SlugField(unique=True, blank=True, null=True)

    def __str__(self):
        return f'{self.name} [{self.tag}]'

    def get_absolute_url(self):
        return reverse("team_detail", kwargs={"slug": self.slug})

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Team, self).save(*args, **kwargs)

    class Meta:
        verbose_name = "Команда"
        verbose_name_plural = "Команды"


class Key(BaseModel):
    team = models.OneToOneField(Team, on_delete=models.SET_NULL, null=True, blank=True)
    key = models.CharField('Код вступления', max_length=20, null=True, blank=True, unique=True)

    def __str__(self):
        return self.key


Ответы (1 шт):

Автор решения: Andrew Holovko

В момент когда форма отправляет запрос, она передает данные о пользователе и не только - к этим данным вы можете доступиться.

Предлагаю в самом методе обработки запроса доставать пользователя, и создавать ему профайл:

def post(request):  # request - переменная в которую форма передаст данные о запросе и тп. 
    if request.method == 'POST':
        form = CreateTeamForm(request.POST)
        if form.is_valid():
            if request.user.is_authenticated:  # проверяем авторизировал ли пользователь
                form.save()
                db_team = Team.objects.latest('id')  # достаем последнюю созданную команду
                profile = Profile(user_id=request.user.id, team_id=db_team.id, leader=True)  # создаём профайл
                profile.save()  # сохраняем
        return redirect('home')

Я немного прокачал Profile, добавив поле leader.

В этот метод также стоит добавить проверку была ли создана команда, думаю суть вы поняли.

→ Ссылка