【问题标题】:Django - .save() not saving data to DBDjango - .save() 不将数据保存到数据库
【发布时间】:2018-04-28 10:48:08
【问题描述】:

我正在尝试创建一个页面,用户可以在其中选择 17 名足球运动员并使用 ModelForm 保存到他们的个人资料中。

表格

class ProfileForm(ModelForm):
class Meta:
    model = Profile
    fields = ['GK1', 'GK2', 'DF1', 'DF2', 'DF3', 'DF4', 'DF5', 'MF1', 'MF2', 'MF3', 'MF4', 'MF5', 'FW1', 'FW2', 'FW3']

观点

def selectteam(request):
print('request.post=', request.POST)
print(request.user)

if request.method == "POST":
    form = ProfileForm(request.POST, instance=request.user)
    if form.is_valid():
        print("form confirmed valid") #let me know that the data is valid
        form.user = request.user      #set the user's data we are changing
        form.save()                   #save the form to db
        for x in form.cleaned_data:   #check what the data is???
            print(x)
        return redirect('/accounts/profile/selectteam')
    else:
        print(form.errors)
        form = ProfileForm()
else:
    selectedplayers = Player.objects.all()
    # if not, you need an empty form for GET request
    form = ProfileForm()
    context = {'selectedplayers': selectedplayers, 'form': form}
    return render(request, 'selectteam.html', context)

在我的一生中,我无法让数据实际提交。这是控制台输出:

[28/Apr/2018 10:27:33] "GET /static/images/pitch.png HTTP/1.1" 200 40216
request.post= <QueryDict: {'MF1': ['301'], 'MF2': ['301'], 'GK1': ['301'], 'DF5': ['301'], 'FW1': ['301'], 'DF1': ['301'], 'MF3': ['301'], 'FW2': ['301'], 'GK2': ['301'], 'MF5': ['301'], 'csrfmiddlewaretoken': ['RtvpMLuPVXaupYNzJdt1yvuJsOhfouH51FUQw73IRzUnKqZRLkzcNHWvoMFyVX4N'], 'DF4': ['301'], 'DF3': ['301'], 'DF2': ['301'], 'FW3': ['301'], 'MF4': ['301']}>
request.method= POST
Johnny
form confirmed valid
GK1
GK2
DF1
DF2
DF3
DF4
DF5
MF1
MF2
MF3
MF4
MF5
FW1
FW2
FW3

所以我可以看到 form.is_valid() 返回 TRUE。我可以看到正在尝试保存哪些数据。我还可以看到据称已更改的字段。

但是,当我进入管理控制台并检查用户“Johnny”时 - 字段仍然是空白/默认!我真的很困惑,因为我所有的检查和验证似乎都很好。

我唯一的猜测是表单实际发送的数据不“适合”可用的选择。例如,它可能正在尝试选择值 ['301'] 但在我的选项列表中,实际值将是 301。也许我应该做某种形式的 data_cleaning?我只是不知道! modelform生成的字段例如:

GK1 = models.ForeignKey('players.PlayerID', on_delete=models.CASCADE, null=True, related_name='+')

如果我做错了什么,谁能发现?谢谢

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    form.user 对创建的对象没有任何影响。要将当前用户添加到创建的对象,您可以执行以下操作:

    if form.is_valid():
        obj = form.save(commit=False)  
        print("form confirmed valid") #let me know that the data is valid
        obj.user = request.user      #set the user's data we are changing
        obj.save()
        return redirect('/accounts/profile/selectteam')
    

    您可以找到有关commit 参数和示例here 的详细信息。

    UPD

    同样request.userUser 模型的实例,但您需要提供给ProfileForm 配置文件实例。所以如果你没有设置AUTH_USER_MODEL=Profile,你应该在视图中做这样的事情:

    form = ProfileForm(request.POST, instance=request.user.profile)
    

    【讨论】:

    • UPD 就是这样 :) 我不得不承认我太菜鸟了,无法理解为什么 request.user 不起作用但 request.user.profile 起作用。再次感谢,这已经让我头晕了 3 天!
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2017-03-06
    相关资源
    最近更新 更多