2009-12-29 2 views
0

J'ai ceci:Set attribut d'un modèle à une certaine valeur avant d'enregistrer

class OrderForm(ModelForm): 
    class Meta: 
     model = Order 
     exclude = ('number',) 

    def __init__(self, *args, **kwargs): 
     super(OrderForm, self).__init__(*args, **kwargs) 
     if self.initial.get('account', None): 
      self.fields['customer'].queryset = Customer.objects.filter(account=self.initial.get('account')) 



    def save(self, force_insert=False, force_update=False, commit=True): 
     m = super(OrderForm, self).save(commit=False) 

     # my custom code was here 

     if commit: 
      m.save() 
     return m 

Cela fonctionne, sauf que je dois régler le « numéro » attribut de « commande » (ce qui est nécessaire) à un certain nombre. Je ne sais pas comment le faire. J'ai essayé d'ajouter:

self.fields['number'] = 50 

dans la méthode « save() », mais je reçois toujours un IntegrityError quand cliquez sur Enregistrer (évidemment ce n'est pas la syntaxe correcte mais il fait allusion à ce que je suis en train de le faire). Un autre problème que j'ai rencontré pour aggraver les choses est que je ne peux même pas accéder aux champs ['nombre'] maintenant parce que c'est dans l'attribut exclure Meta (je ne veux pas que les gens puissent l'éditer, ou que ce soit un) .

Devrais-je le faire dans la méthode "save()" de mon modèle à la place, ou peut-être dans le "init()"?

Répondre

2

Cela semble être plus propre dans le modèle. Ce serait la syntaxe dans la méthode du modèle d'économie:

def save(self, force_insert=False, force_update=False): 
    self.number = 50 
    super(Order, self).save(force_insert, force_update) 

Si vous allez vraiment régler chaque fois comme ça, alors vous pouvez déclarer le droit dans le modèle de la commande comme:

class Order(models.Model): 
    number = models.IntegerField(default=50) 
+0

50 est juste un exemple. Je vais le générer dynamiquement (pseudo incrémentation). J'ai aussi besoin d'accéder à la partie "initial.account". Comment ferais-je cela dans le modèle? Fondamentalement je veux lire les attributs de nombre de tous les ordres qui ont compte = SpamAccount. – orokusaki

+0

Vous pouvez exécuter des requêtes à partir de votre méthode save(), comme vous le pouvez dans une vue. –

+0

Je veux l'enregistrer chaque fois à 50, et je ne veux pas qu'il soit envoyé à partir du formulaire. comment devrais-je faire ça? – Clayton

1

Je pense que c'est le genre de chose que vous devriez faire dans la méthode «propre». Les documents de validation de formulaire django sont here. Essentiellement, il vous donnera un dictionnaire des champs nettoyés et vous permet ensuite de faire une validation plus compliquée qui nécessite l'information de nombreux champs. Le vous pouvez retourner le dictionnaire des données corrigées ... y compris tout ce que vous devez ajouter ou remplacer.

Si vous incluez le code du modèle, nous pourrions vous aider un peu plus.

0

vous pourriez avoir simplement mettre

m.number = 50 

Où vous avez

# my custom code was here 

self.fields est une liste de champs, pas leurs valeurs. Si vous voulez accéder aux valeurs, utilisez self.cleaned_data. Cela ne vous aide pas dans self.save() cependant, utilisez m.number car m est l'instance qui a été créée.

Questions connexes