代码之家  ›  专栏  ›  技术社区  ›  Pranav S

Django更新整个对象(行)

  •  1
  • Pranav S  · 技术社区  · 6 年前

    我试图用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”]在我的视图中获取该页面的值。

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Roseman    6 年前

    这基本上是错误的做法。首先,不需要创建 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})
    

        2
  •  0
  •   Usman Abasi    6 年前

    你可以这样做:

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