python - Django 更新整个对象(行)
问题描述
我正在尝试使用属性用户名和全名更新名为用户的对象;我的模型如下。
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"] 在我的视图中从该页面获取值。
我的问题是如何更新整个对象,而无需在更新中指定特定属性或无需获取对象并设置我的新值并保存对象;我的观点如下。
def editUserByID(request, userID):
if (request.method == "POST"):
if (request.POST["userID"] != '' and request.POST["fullname"] != '' and request.POST["username"] != ''):
用户 1 = 用户(
pk=request.POST["userID"],
全名=request.POST["全名"],
用户名=request.POST[“用户名”]
)
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 的内置身份验证框架。
推荐阅读
- numpy - numpy 安装到 pypy3 虚拟环境中:`未定义的符号:cblas_sgemm`
- class - 矢量打印不正确的数据
- html - JSoup:获取维基百科页面摘要
- javascript - 在同一页面弹出窗口中显示来自另一个页面的模式内容
- vue.js - weex 输入数限制
- javascript - 映射存储在 Redux 存储中的 JSON 对象?
- iptables - 由于fail2ban,iptables变得巨大
- java - 如何在图书馆的活动中重用应用程序的工具栏?
- python - 如何从用户的选择中调用子程序
- python-3.x - 创建具有一个/多个字符替换的字符串列表