Django 更新整个对象(行)



我正在尝试使用属性用户名和全名更新名为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")

我已经创建了一个编辑页面,并且能够通过请求从我的视图中获取该页面的值。发布["全名"]并请求。开机自检["用户名"]。

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

def editUserByID(request, userID(: if (request.method == "POST"(: 如果(请求。POST["userID"] != '' 并请求。POST["全名"] != '' 并请求。POST["用户名"] != ''(: 用户 1 = 用户( pk=请求。发布["用户 ID"], 全名=请求。邮政["全名"], 用户名=请求。发布["用户名"] )

print(user1) # this only updates 1 property, so for multiple properties I would have to write multiple statements User.objects.filter(pk=user1.pk).update(fullname=user1.fullname) # is this possible? send the entire object and have it update the DB User.objects.filter(pk=user1.pk).update(user1) # this is how I was able to save it, but have to get the existing object again, assign the new values and then save updateUser = User.objects.get(pk=user1.pk) updateUser.fullname=user1.fullname updateUser.username=user1.username updateUser.save() else: user2 = User.objects.get(pk=userID) return render (request, 'helloworld/editUser.html', {'user': user2}) return redirect('listUsers')

PS:到目前为止,我一直在使用Java和.NET,但是我对Python/Django完全陌生,因此任何帮助将不胜感激。

这主要是错误的方法。首先,无需创建user1;如果要更新现有对象,则应直接在此处设置值。

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

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的内置身份验证框架。

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

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')

最新更新