由于此行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)
答案 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文件中的内容动态创建模型?
希望这有帮助。