2016-09-29 3 views
0

Wo soll ich meine save() Funktion in Django schreiben: in models.py in einer Modellklasse oder in forms.py in einer Form?Wo schreibe ich die Speicherfunktion in Django?

Zum Beispiel: 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.... 

Wo soll ich meine speichern Funktion außer Kraft setzen?

+0

bitte kann jeder geben Sie mir einen Anwendungsfall, in dem, wo ich außer in model.py oder form.py außer Kraft gesetzt werden, nach zu @Sardorbek Imomaliev, ich lerne den Use Case und den Nutzen von Überreiten kennen, spare in forms.py! – dilwaria

+0

@Moderator Warum wurde diese Frage abgelehnt – dilwaria

Antwort

0

Es hängt wirklich davon ab, was Sie erreichen möchten. Standardrealisierung von ModelForm 's speichern Anrufe Model speichern. Aber es ist normalerweise besser, es auf form zu überschreiben, weil es auch Validierung ausführt. Also, wenn Sie bereits Formular verwenden, würde ich empfehlen, ModelForm.save zu überschreiben. Und durch zwingende ich meine mit Verlängerung super

Hier ist standardmäßig Realisierung von 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

danke ist hilfreich, zuerst aus der Perspektive der Validierung, weil ich validieren muss. aber können Sie mir einen einzigen Anwendungsfall geben, wo ich die Speicherfunktion in model.py – dilwaria

+0

@dilwaria überschreiben wird, gibt es fast nie tatsächliche Notwendigkeit, das Speichern des Modells zu überschreiben. Weil es viele Dinge tut, die nicht berührt/verändert werden sollten. Wenn Sie Schritte zum Speichern des Modells hinzufügen möchten, können Sie normalerweise [django signals] (https://docs.djangoproject.com/en/1.10/topics/signals/) verwenden. Meiner Erfahrung nach überschreiben Leute das Speichern von Modellen nur, weil sie nichts über Signale wissen oder genau wissen, was sie tun. –

+0

@Sardorbrek danke für den Einblick und die Best Practice-Sache! Ich werde auch die Djangosignale durchgehen! – dilwaria

Verwandte Themen