gpt4 book ai didi

python - Django 更新整个对象(行)

转载 作者:行者123 更新时间:2023-12-01 01:35:21 25 4
gpt4 key购买 nike

我正在尝试使用属性 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"] 从我的 View 中获取该页面的值。

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

def editUserByID(request, userID):    if (request.method == "POST"):        if (request.POST["userID"] != '' and request.POST["fullname"] != '' and request.POST["username"] != ''):            user1 = User(                pk=request.POST["userID"],                fullname=request.POST["fullname"],                username=request.POST["username"]            )

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

关于python - Django 更新整个对象(行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52441664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com