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



我现在得到下面的错误,因为这行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)

在第二个调用中,您传入form.cleaned_data,这是一个映射(一个dict),因此您正在遍历键,这是字符串。

另一方面,在第一个调用中,您传入的是form本身。因此,第二次调用是不一样的;下面的调用是:

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

这里的问题是,如果这就是你真正想要做的

在第一种情况下,你的form参数是一个form实例。

第二个form参数是一个字典实例。

additionnal:

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

至于它的价值,我认为有更简单的方法来实现你想要实现的(如果我猜对了,就是加载CSV文件):

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

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文件中找到的内容动态创建模型?

最新更新