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].

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