2017-05-06 61 views
0

我有一个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'] 
+0

1.该行不在您发布的代码中。 2.'post'不是'POST'副本,它是'SerialInstanceForm'。 3.'SerialInstanceForm'没有'product_id'属性。 – jonrsharpe

+0

@jonrsharpe你是对的,我错误地添加了错误的行。我编辑的问题是正确的。 product_id是否需要在表单中?它在模型中还不够吗?这个想法是,而不是把它放在窗体中,我想要一个单独的文本框,您可以输入多个产品ID,用换行符分隔,之后我将它们放入列表中,并为列表中的每个产品ID创建数据库记录。希望这是有道理的。谢谢你的帮助! –

+0

你究竟在做什么?用虚拟数据给出一些例子。除了“发布”问题之外,在你的看法中,你只是循环使用相同的数据。为什么要这么做..? – zaidfazil

回答

1

从你说的,我已经编辑按我的思维方式应该是你的看法, 我不知道如果这项工作与否,但肯定帮助你了解一些事情。

您不需要使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}) 
+0

谢谢。我测试过它,它只添加一条记录,当有多条记录时,并且有一个不正确的值,但至少它可以节省一些东西!我会玩弄你的建议,并在我得到它的时候批准它。谢谢! –

+0

我编辑了视图,只是检查出来。 – zaidfazil

+0

这是行得通!在值被保存时仍然存在一个小错误,但我确定这只是我使用'.splitlines()'而已。感谢你的帮助! –

相关问题