0

由于这条线,我现在收到以下错误setattr(CsvModel, field.value(), CharField())

错误:“dict”对象不可调用

视图.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)

任务.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)

模型.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)
4

2 回答 2

2

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

另一方面,在第一次调用中,您传递的是form自身。因此,第二次调用不一样;以下调用将是:

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

这里的问题是这是否是你真正想要做的。

于 2013-04-18T21:07:00.060 回答
1

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

在第二个中,您的表单参数是一个 dict 实例。

另外:

我认为您的import_this方法(如果它确实是您模型的方法)缺少self第一参数或应该声明为@staticmethod. 它可能会为您省去使用 import_this(self.xxx, self.yyy, ...) 调用它的麻烦,但我不太确定您如何从 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 文件中找到的内容动态创建模型?

希望这可以帮助。

于 2013-04-18T21:07:13.550 回答