错误django'dict'对象不可调用

时间:2013-04-18 20:55:35

标签: python django

由于此行setattr(CsvModel, field.value(), CharField())

,我现在收到以下错误

错误:'dict'对象无法调用

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)

过程

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)

2 个答案:

答案 0 :(得分:2)

在第二个调用中,您传入form.cleaned_data,这是一个映射(一个dict),因此您循环遍历键,即字符串。< / p>

另一方面,在第一个电话中,您正在传递form本身。因此第二次呼叫是不一样的;以下电话将是:

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

这里的问题是,如果这实际上是意味着要做的事情。

答案 1 :(得分:1)

在第一种情况下,您的表单参数是表单实例。

在第二个你的表单参数是一个dict实例。

Additionnally:

我认为您的import_this方法(如果它确实是您的模型的方法)缺少 self 第一个参数,或者应该声明为@staticmethod。它可以省去用import_this调用它的麻烦(self.xxx,self.yyy,...)但我不太确定你如何从upload.process()调用import_method()(我的Django)有点生锈)。

对于它的价值,我认为有更简单的方法可以实现您想要实现的目标(如果我想的话,那就是加载CSV文件):

没有表单验证:查看csv.DictReader()将返回文件中每行的dict。然后做:

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

使用表单验证从文件中读取的数据:执行相同操作,但需要实现ModelForm,您需要定义:

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

你在做什么看起来像某种奇怪的,破坏大脑的元编程......你是否试图通过CSV文件中的内容动态创建模型?

希望这有帮助。