繁体   English   中英

Python 3 / Django 2,保存前将字典值传递给form字段

[英]Python 3 / Django 2, Passing a dictionary value to form field before saving

我正在尝试让我的应用使用在表单上输入的序列号来与字典进行比较,并在保存之前更新表单上的产品字段。 详细信息如下:

  • 词典有两列,“产品代码”和“产品”
  • 在表格上输入的序列号的前三位数字将与字典中的产品代码匹配。
  • 用户提交表单后,我希望它评估序列号的前三位数,将其与字典键进行比较,然后在保存表单之前将“产品”表单字段更改为dict ['产品']。

这是我的看法:

def create(request):
#Page with input form to submit new records
if request.method == 'POST':
    form = RecordForm(request.POST)
    if form.is_valid():
        sn = request.POST.get('serial')
        with open('prodlist.csv') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                if sn[0:2] in row['Product Code']:
                    form.fields['product'].update = row['Product']
                else:
                    pass
        form.save()
        return HttpResponseRedirect('/tracker/all/')
else:
    form = RecordForm()
return render(request, 'tracker/form2.html', {'form': form}, RequestContext(request))

这样,我在“产品”部分遇到了一个关键错误。 提交值后,是否可以将值传递给表单字段?

更新:

我已经在form.py中将产品字段添加到表单本身:

class RecordForm(ModelForm):
class Meta:
    model = Record
    fields = ['serial',
              'ticket',
              'product',
              'eng_date',
              'customer',
              'details',
              'owner',
              'status',
              'seed_num'
             ]
    widgets = {
            'eng_date': DateInput(),
            }

而且我已经将form.fields['product'].update = row['Product']行更改为form.cleaned_data['product'] = row['Product'] 并添加了else:子句以编写任何内容,以防万一找不到序列号: else: form.cleaned_data['product'] = '5678'

这是完整视图:

def create(request):
#Page with input form to submit new records
if request.method == 'POST':
    form = RecordForm(request.POST)
    if form.is_valid():
        sn = request.POST.get('serial')
        with open('prodlist.csv') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                if sn[0:2] in row['Product Code']:
                    form.cleaned_data['product'] = row['Product']
                else:
                    form.cleaned_data['product'] = '5678'
        form.save()
        return HttpResponseRedirect('/tracker/all/')
else:
    form = RecordForm()
return render(request, 'tracker/form2.html', {'form': form}, RequestContext(request))

任何帮助将不胜感激 :)

试试这个

form.cleaned_data['product'] = row['Product']

我能够使它正常工作! 必须使用obj = form.save(commit=false) ,然后将值传递给obj.product ,然后再传递obj.save() 实际情况如下:

def create(request):
#Page with input form to submit new records
if request.method == 'POST':
    form = RecordForm(request.POST)
    if form.is_valid():
        sn = request.POST.get('serial')
        with open('prodlist.csv') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                if sn[0:2] in row['Product Code']:
                    obj = form.save(commit=False)
                    obj.product = row['Product']
                    obj.save()
                    break
                else:
                    pass
        form.save()
        return HttpResponseRedirect('/tracker/all/')
else:
    form = RecordForm()
return render(request, 'tracker/form2.html', {'form': form}, RequestContext(request))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM