2016-09-29 75 views
0

我应该在哪里写我的save()函数在Django中:在models.py的模型类中,或者在forms.py的表格中?在Django中写保存函数的地方在哪里?

例如: models.py

class Customer(models.Model): 
    name = models.CharField(max_length=200) 
    created_by = models.ForeignKey(User) 

    def save(): 
     ........ some code to override it....... 

forms.py

class Addcustomer(forms.ModelForm): 
    class Meta: 
     model = Customer 
     fields = ('name',) 
    def save(): 
    ........code to override it.... 

我应该在哪里重写我的保存功能?

+0

请每个人都可以给我了根据使用情况,其中,在那里我将覆盖保存在model.py或form.py,到@Sardorbek Imomaliev,我了解了用例和保存在forms.py中的好处! – dilwaria

+0

@Moderator为什么这个问题被低估了 – dilwaria

回答

0

这真的取决于你想达到的目标。默认实现ModelForm的保存来电Model的保存。但通常在form上覆盖它会更好,因为它也会运行验证。所以如果你已经在使用表格,我会建议覆盖ModelForm.save。并通过重写我的意思是使用super

这里延伸的默认实现ModelForm.save

def save(self, commit=True): 
    """ 
    Save this form's self.instance object if commit=True. Otherwise, add 
    a save_m2m() method to the form which can be called after the instance 
    is saved manually at a later time. Return the model instance. 
    """ 
    if self.errors: # there validation is done 
     raise ValueError(
      "The %s could not be %s because the data didn't validate." % (
       self.instance._meta.object_name, 
       'created' if self.instance._state.adding else 'changed', 
      ) 
     ) 
    if commit: 
     # If committing, save the instance and the m2m data immediately. 
     self.instance.save() 
     self._save_m2m() 
    else: 
     # If not committing, add a method to the form to allow deferred 
     # saving of m2m data. 
     self.save_m2m = self._save_m2m 
    return self.instance 

save.alters_data = True 
+0

感谢是有益的,首先从验证的角度来看,因为我需要验证。但你可以给我一个用例,我将覆盖保存功能在model.py – dilwaria

+0

@dilwaria几乎从来没有实际需要重写模型的保存。因为它有很多不应该被触及/改变的东西。通常如果你想在模型的保存中添加步骤,你可以使用[django signals](https://docs.djangoproject.com/en/1.10/topics/signals/)。根据我的经验,人们只会忽略模型的保存,因为他们不知道信号或者完全不知道他们在做什么。 –

+0

@Sardorbrek感谢您的洞察力和最佳实践!我也会通过Django的信号! – dilwaria