Django как сохранить модель пользователя?
Снова добрый день, У меня есть форма и пользователь может добавить несколько названий. При каждом submit создается новый объект, который включает в себя написанное название и пользователя, который его написал (отправил форму).
Я пробовал с этим, но не знаю, что добавить в NewTitle.objects.create(title=title, ...)
\views.py
def title_view(request):
try:
profile = request.user.newtitle
except NewTitle.DoesNotExist:
profile = NewTitle(user=request.user)
if request.method == 'POST':
form = NewTitleForm(request.POST, instance=profile)
if form.is_valid():
title = form.cleaned_data["title"]
NewTitle.objects.create(title=title) #in the () I have to add the user= aswell
return redirect('/another')
else:
form = NewTitleForm(instance=profile)
return render(request, 'test.html', {'form': form, 'profile': profile})
\models.py
class NewTitle(models.Model):
user = models.OneToOneField(
User, default=None, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
Я работаю с базовой моделью User. Сейчас пользователь может отправить форму и будет создан новый объект только с заданным заголовком, но без пользователя, который его написал, потому что я просто добавил title=title, а не user=...
Есть идеи?
Если вы хотите обновить существующий NewTitle для этого пользователя, или создать новый, если такого элемента не существует, вы можете .save() использовать form, так:
from django.contrib.auth.decorators import login_required
@login_required
def title_view(request):
try:
profile = request.user.newtitle
except NewTitle.DoesNotExist:
profile = NewTitle(user=request.user)
if request.method == 'POST':
form = NewTitleForm(request.POST, instance=profile)
if form.is_valid():
form.save()
return redirect('/another')
else:
form = NewTitleForm(instance=profile)
return render(request, 'test.html', {'form': form, 'profile': profile})
Вы также должны отменить идентификацию части return render(…) таким образом, чтобы в случае неудачи формы, вы вернули форму с сообщениями об ошибках.
Если вы хотите каждый раз создавать новый, вы не можете сделать это с помощью OneToOneField: OneToOneField - это ForeignKey с unique=True: это означает, что у пользователя есть максимум один NewTitle объект, который ссылается на этого пользователя. Если вы хотите иметь возможность конструировать несколько, вы можете работать с ForeignKey:
from django.conf import settings
class NewTitle(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
default=None,
null=True,
on_delete=models.CASCADE
)
title = models.CharField(max_length=200)
и тогда вид выглядит следующим образом:
from django.contrib.auth.decorators import login_required
@login_required
def title_view(request):
if request.method == 'POST':
form = NewTitleForm(request.POST, instance=NewTitle(user=request.user))
if form.is_valid():
form.save()
return redirect('/another')
else:
form = NewTitleForm()
return render(request, 'test.html', {'form': form})
но тогда вы, конечно, не сможете получить .newtitle объекта User, поскольку их может быть ноль, один или несколько.
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL[Django-doc] для ссылки на модель пользователя, чем использоватьUserмодель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка наUserмодель раздел документации .
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_requiredдекоратора [Django-doc].