Python 为什么我的request.post对象在调用.copy()后不可变?
我有一个ModelForm的HTML视图,我试图获取一个单独的用户输入,称为scanner\u input,在上面运行一些代码,然后用我刚才运行的代码的结果替换request.post['product\u id'] ,它说了同样的事情,request.post对象可以通过使用.copy进行修改,但我收到以下错误消息:Python 为什么我的request.post对象在调用.copy()后不可变?,python,django,django-forms,Python,Django,Django Forms,我有一个ModelForm的HTML视图,我试图获取一个单独的用户输入,称为scanner\u input,在上面运行一些代码,然后用我刚才运行的代码的结果替换request.post['product\u id'] ,它说了同样的事情,request.post对象可以通过使用.copy进行修改,但我收到以下错误消息: 'SerialInstanceForm' object does not support item assignment 从我的观点来看,错误发生在此行中: post['pro
'SerialInstanceForm' object does not support item assignment
从我的观点来看,错误发生在此行中:
post['product_id'] = scanner_input_list[i]
以下是我的看法:
def SerialMulti(request):
if request.method == "POST":
form = SerialInstanceForm(request.POST)
if form.is_valid():
scanner_input = request.POST['scanner_input']
scanner_input_list = scanner_input.splitlines()
for i in range(0, len(scanner_input_list)):
post = SerialInstanceForm(request.POST.copy())
post['product_id'] = scanner_input_list[i]
post.save()
return render(request, 'serial_multi.html', {'form': form})
else:
form = SerialInstanceForm()
return render(request, 'serial_multi.html', {'form': form})
我的模型:
class ProductSerialInstance(models.Model):
STATUS_CHOICES = (
('in_inventory', 'In Stock'),
('given_out', 'Given Out'),
('repair', 'Repair')
)
name = models.ForeignKey(ProductSerial)
employee = models.ForeignKey(Employee, blank=True, null=True)
it_dep = models.ForeignKey(ItDep)
product_id = models.CharField(max_length=50)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='draft')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.name
我的表格:
class SerialInstanceForm(forms.ModelForm):
# duplications = forms.IntegerField()
class Meta:
model = ProductSerialInstance
fields = ['name','employee','it_dep','status']
根据你说的,我根据我认为应该的方式编辑了你的观点, 我不知道这是否有效,但肯定能帮助你理解一些事情 获取数据时,不需要使request.POST可变
def SerialMulti(request):
if request.method == "POST":
form = SerialInstanceForm(request.POST)
if form.is_valid():
scanner_input = request.POST.get('scanner_input')
scanner_input_list = scanner_input.splitlines()
for i in range(0, len(scanner_input_list)):
#edited here to make multiple instances save.
post = ProductSerialInstance.objects.create(**form.cleaned_data)
post.product_id = scanner_input[i]
post.save()
return render(request, 'serial_multi.html', {'form': form})
else:
form = SerialInstanceForm()
return render(request, 'serial_multi.html', {'form': form})
1.那一行不在你发布的代码中。2.post不是post副本,它是一个SerialInstanceForm。3.SerialInstanceForm没有product\u id属性。@jonrsharpe你说得对,我错加了一行。我已将问题编辑为正确的。产品标识是否需要在表单中?在模型里还不够吗?这个想法是,我不想把它放在表单中,而是想要一个单独的文本字段,在这里你可以输入多个产品id,用换行符分隔,然后我把它们放在一个列表中,并为列表中的每个产品id创建数据库记录。希望这是有道理的。谢谢你的帮助!你到底想达到什么目的?给出一些虚拟数据的例子。。此外,在您看来,除了post问题,您只是在循环相同的数据。为什么要这样做?@FazilZaid我希望用户能够添加多个共享相同数据但具有不同产品id的记录。因此,用户可以输入name=Magic Mouse,employee=John,it_dep=CPH,status=On loan,然后在文本字段中输入abc\n def\n ghi\n。当用户提交时,它将获取该字符串,在每个字符串上进行拆分,\n并创建相同的数据库记录,但具有不同的产品id。谢谢。我已经测试过了,当有多条记录时,它只添加了一条记录,并且值不正确,但至少它保存了一些东西!我会认真考虑你的建议,等我的建议奏效后再批准。谢谢那太好了!在保存的值中仍然有一个小错误,但我确信这只是我使用的.splitlines。谢谢你的帮助!很高兴我能帮上忙!!对于那些想知道正确答案的人来说,post.product\u id=scanner\u input[i]只需更改为post.product\u id=scanner\u input\u list[i]即可。