我现在得到下面的错误,因为这行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文件中找到的内容动态创建模型?