【问题标题】:Django how to save User Model?Django如何保存用户模型?
【发布时间】:2022-01-20 19:35:57
【问题描述】:

又是美好的一天, 所以我有一个表单,用户可以添加多个标题。每次提交都会创建一个新对象,其中包括书面标题和编写它的用户(提交表单)。

我试过了,但我不知道在 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)

我正在使用基本的用户模型。目前,用户可以提交表单,新对象将仅使用给定的标题创建,但没有编写它的用户,因为我只是添加了 title=title 而不是 user=...

有什么想法吗?

【问题讨论】:

  • 我的老问题和你的回答把我推向了正确的方向,但问题仍然没有解决
  • 一个user只能有一个 NewTitle?
  • 我不知道,一个用户应该可以有很多标题。每次用户提交表单时都会创建一个新对象。我必须使用类似 manytoone 的东西吗?
  • 是的,那是ForeignKey
  • 但是您的观点似乎表明您想编辑现有的NewTitle,而不是创建一个新的?否则我不清楚你为什么用instance=profile构造表单。

标签: python django


【解决方案1】:

如果您想为该用户更新现有的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来做:OneToOneFieldForeignKeyunique=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})

但是您当然不能获取User 对象的.newtitle,因为可以有零个、一个或多个。


注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation


注意:您可以使用 @login_required decorator [Django-doc].

【讨论】:

  • 非常感谢!但是 python manage.py 只是带来了 uns TypeError: 'function' object is not iterable
  • edit:原因是装饰器。装饰器必须在views.py中
  • @rPi: 抱歉,我打错了,确实应该装饰视图功能。
  • 我检查了它并修复了一个错误。这段代码的挑战是您仍然只能为每个用户创建一个标题。当您尝试创建第二个时,我们得到“UNIQUE 约束失败:usertest_newtitle.user_id”。
  • @rPi:您是否进行了迁移并迁移了数据库?因为对于一个简单的ForeignKey,它不应该有唯一性约束。
猜你喜欢
  • 2011-01-14
  • 2016-08-16
  • 2012-12-07
  • 1970-01-01
  • 2010-10-26
  • 2020-10-16
  • 2017-10-20
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多