Python Django更新整个对象(行)

Python Django更新整个对象(行),python,django,Python,Django,我试图用username和fullname属性更新名为User的对象;我的模型在下面 class User(models.Model): """docstring for User""" fullname = models.TextField() username = models.TextField() password = models.TextField() createdDate = models.DateTimeField(default=timezone.now) publishe

我试图用username和fullname属性更新名为User的对象;我的模型在下面

class User(models.Model):
"""docstring for User"""

fullname = models.TextField()
username = models.TextField()
password = models.TextField()
createdDate = models.DateTimeField(default=timezone.now)
publishedDate = models.DateTimeField(blank=True, null=True)

def publish(self):
    self.publishedDate = timezone.now
    self.save()

def __str__(self):
    return str("\npk= " + self.pk + " | fullname= " + self.fullname + " | username= " + self.username + "\n")
我已经创建了一个编辑页面,并且能够通过request.POST[“fullname”]和request.POST[“username”]在我的视图中从该页面获取值

我的问题是如何更新整个对象,而不必在更新中指定特定属性,或者不获取对象并设置新值并保存对象;我的观点如下

class User(models.Model):
"""docstring for User"""

fullname = models.TextField()
username = models.TextField()
password = models.TextField()
createdDate = models.DateTimeField(default=timezone.now)
publishedDate = models.DateTimeField(blank=True, null=True)

def publish(self):
    self.publishedDate = timezone.now
    self.save()

def __str__(self):
    return str("\npk= " + self.pk + " | fullname= " + self.fullname + " | username= " + self.username + "\n")


PS:到目前为止,我一直在使用Java和.NET,但我对Python/Django完全陌生,因此非常感谢您的帮助。

这基本上是错误的方法。首先,不需要创建
user1
;如果要更新现有对象,只需直接在其中设置值

但是在Django中实现这一点的方法是使用一个ModelForm。这有很多优点,特别是它将验证您的输入,检查是否提供了所有必需的字段,以及它们的类型是否正确。在实例化表单时,可以将现有用户作为
实例
参数传递,然后在保存表单时,该实例将被更新

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = '__all__'

...

def editUserByID(request, userID):
    obj = User.objects.get(userID)
    if request.method == 'POST':
        form = UserForm(request.POST, instance=obj)
        if form.is_valid():
           form.save() # updates the existing object
           return redirect('home')
    else:
        form = UserForm(instance=obj)  #  prepopulates the form with values from the instance
    return render(request, 'mytemplate.html', {'form': form})

此外,我支持Risadinha的观点,即您不应该创建自己的用户模型;使用Django的内置auth框架。

您可以在一行中完成,如下所示:

User.objects.filter(pk=user1.pk).update(fullname=user1.fullname, 
username=user1.username) 
# You can get user based on your logic
user = request.user
# 'EditUserForm' is the custom form, read more about django model forms if you already have not, https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method
user_form = EditUserForm(request.POST, instance=user)
if user_form.is_valid():
    user_form.save()
else:
    user2 = User.objects.get(pk=userID)
    return render (request, 'helloworld/editUser.html', {'user': user2})

return redirect('listUsers')
更新模型的另一种方法是使用如下表单:

User.objects.filter(pk=user1.pk).update(fullname=user1.fullname, 
username=user1.username) 
# You can get user based on your logic
user = request.user
# 'EditUserForm' is the custom form, read more about django model forms if you already have not, https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method
user_form = EditUserForm(request.POST, instance=user)
if user_form.is_valid():
    user_form.save()
else:
    user2 = User.objects.get(pk=userID)
    return render (request, 'helloworld/editUser.html', {'user': user2})

return redirect('listUsers')

使用Django的一个非常重要的原因是:它带来了一个现有的身份验证/授权框架,它是任何用户包括登录和其他任何内容的基础。您可能会使用Django,因为您不想实现表单抓取。请看,我正在使用用户作为示例,但如果它是汽车、船或类似的东西,是否可以在一行代码中更新整个对象(多个属性)?谢谢你的文档,顺便说一句,我一定会去查看的。“但是必须再次获取现有对象”-你不需要“再次获取”。只要将它存储在一个变量中,更改它的字段,并随时保存即可。谢谢,这就是我想要的。已创建用于添加用户的表单,但不确定如何对用户进行编辑。我肯定会调查Risadinha提供的链接;但如果它不是“用户”,那么这是正确的方法吗?