2013-04-18 4 views
1

je reçois maintenant l'erreur ci-dessous à cause de cette ligne setattr(CsvModel, field.value(), CharField())erreur django 'dict' objet n'est pas appelable

Erreur: objet 'dict' est pas appelable

views.py

if request.method == 'POST': 
     form = ConfiguratorForm(data=request.POST) 
     # Send import to task. 
     # Clean all data and add to var data. 
     if form.is_valid(): 
      data = form.cleaned_data 
      process_upload.delay(upload_id=upload.id, form=data) 

tasks.py

@task 
def process_upload(upload_id, form): 
    upload = Upload.objects.get(id=upload_id) 
    upload.process(form=form) 

processus

import_this(data=self.filepath, extra_fields=[ 
       {'value': self.group_id, 'position': 5}, 
       {'value': self.uploaded_by.id, 'position': 6}], form=form) 

model.py

def import_this(form, *args, **kw): 
    # make custom ContactCSVModel 
    class ContactCSVModel(CsvModel): 

     for k, v in form: 
      setattr(CsvModel, v, CharField()) 


     group = DjangoModelField(Group) 
     contact_owner = DjangoModelField(User) 

     class Meta: 
      delimiter = "," 
      dbModel = Contact 
      update = {'keys': ["mobile", "group"]} 

    return ContactCSVModel.import_data(*args, **kw) 
+1

Semble que 'field' est une chaîne à la place. Quelle est la forme? –

+0

@Martijn Pieters question mise à jour avec le formulaire – Prometheus

Répondre

1

Dans le deuxième appel vous êtes de passage dans form.cleaned_data, qui est une cartographie (a dict), de sorte que vous êtes en boucle sur les touches, qui sont des chaînes. Par contre, dans le premier appel, vous passez le form lui-même. Le second appel n'est donc pas le même; l'appel suivant serait:

form = ConfiguratorForm(data=request.POST) 
if form.is_valid(): 
    process_upload(upload_id=upload.id, form=form) 

La question est ici si c'est ce que vous avez réellement voulu dire à faire.

+0

désolé, je l'ai corrigé sur mon dernier edit les deux ont du retard, désolé pour cette confusion. – Prometheus

+0

voir la question mise à jour – Prometheus

+1

FWIW Spikes avait une PickleError lors du passage de l'ensemble du formulaire. –

1

Dans le premier cas, votre argument de formulaire est une instance de formulaire.

Dans la seconde, votre argument de formulaire est une instance dict.

Additionnellement:

Je pense que votre méthode import_this (si elle est, en effet, une méthode de votre modèle) ne dispose pas d'une auto premier argument ou doit être déclarée comme @staticmethod. Cela peut vous épargner la peine de l'appeler avec import_this (self.xxx, self.yyy, ...) Mais je ne sais pas trop comment vous allez de upload.process() à un appel à import_method() (mon Django est un peu rouillé).

Et pour ce que ça vaut, je pense qu'il existe des moyens beaucoup plus simples à réaliser ce que vous voulez atteindre (qui, si je suppose bien, est un fichier CSV de charge):

Sans validation du formulaire: jetez un oeil à csv.DictReader () retournera un dict pour chaque ligne de votre fichier. Ensuite, faites:

with csv.DictReader(...) as r: 
    for line in r: 
     instance = MyModel(**line) 
     instance.save() 

Avec un formulaire pour valider les données lues à partir du fichier: faire la même chose, mais instancie un ModelForm, que vous devez définir:

with csv.DictReader(...) as r: 
    for line in r: 
     form = MyModelForm(**line) 
     form.save() 

Ce que vous faites ressemble une sorte de méta-programmation étrange et dommageable pour le cerveau ... Essayez-vous de créer un modèle à la volée, à partir de ce que vous trouvez dans un fichier CSV?

Espérons que cela aide.

+0

Donc avec l'instance dict (celle avec laquelle j'obtiens l'erreur) j'ai besoin d'obtenir la valeur du champ, comme vous pouvez le voir je boucle et j'obtiens cette valeur qui devrait marcher, ie field.value() – Prometheus

+0

voir la question mise à jour – Prometheus

+0

s'il vous plaît faites-vous une faveur et au moins apprendre les choses très basiques que vous devez savoir pour faire n'importe quoi avec Python et Django. Les formulaires Django sont documentés et dict est la structure de données la plus utilisée en Python. –

Questions connexes