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 шт):
В момент когда форма отправляет запрос, она передает данные о пользователе и не только - к этим данным вы можете доступиться.
Предлагаю в самом методе обработки запроса доставать пользователя, и создавать ему профайл:
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.
В этот метод также стоит добавить проверку была ли создана команда, думаю суть вы поняли.