调用.copy()后,为什么我的request.post对象不可变?
我有一个ModelForm的HTML视图,其中我试图获取一个名为scanner_input
的单独用户输入,在其上运行一些代码,然后用刚刚运行的代码的结果替换request.post['product_id']
。调用.copy()后,为什么我的request.post对象不可变?
EverywhereIlook,它说同样的事情,那request.post对象可以通过使用.copy(进行可变的),但我得到了以下错误消息:
'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})
谢谢。我测试过它,它只添加一条记录,当有多条记录时,并且有一个不正确的值,但至少它可以节省一些东西!我会玩弄你的建议,并在我得到它的时候批准它。谢谢! –
我编辑了视图,只是检查出来。 – zaidfazil
这是行得通!在值被保存时仍然存在一个小错误,但我确定这只是我使用'.splitlines()'而已。感谢你的帮助! –
1.该行不在您发布的代码中。 2.'post'不是'POST'副本,它是'SerialInstanceForm'。 3.'SerialInstanceForm'没有'product_id'属性。 – jonrsharpe
@jonrsharpe你是对的,我错误地添加了错误的行。我编辑的问题是正确的。 product_id是否需要在表单中?它在模型中还不够吗?这个想法是,而不是把它放在窗体中,我想要一个单独的文本框,您可以输入多个产品ID,用换行符分隔,之后我将它们放入列表中,并为列表中的每个产品ID创建数据库记录。希望这是有道理的。谢谢你的帮助! –
你究竟在做什么?用虚拟数据给出一些例子。除了“发布”问题之外,在你的看法中,你只是循环使用相同的数据。为什么要这么做..? – zaidfazil