如何将 'request.POST' 从视图传递给 Django 中的函数
How to pass 'request.POST' from views to a function in Django
问题已解决,代码反映了解决方案
对于某种网上商店(有点复杂,但对想法有帮助),我基于同一模型创建了四种不同的表单。
根据产品的不同,我想显示一些字段并隐藏其他字段,并在必要时设置为必需。
注意:它不是一个视图中的多个表单,我只想显示四个表单中的一个
在视图中我有以下代码:
def add_regelset(request, bon_id, product_id):
bon = get_object_or_404(Bon, pk=bon_id)
product = get_object_or_404(Product, pk=product_id)
if request.method == 'POST':
form = form_choice(product, None, request.POST)
if form.is_valid():
formregelset = form.save(commit=False)
formregelset.bon_id = bon.id
formregelset.save()
# Haal de nieuwe regelset op en maak de nodige regels aan
regelset = get_object_or_404(Regelset, id=formregelset.id)
maak_regelset.delay(regelset.id)
return HttpResponseRedirect(reverse('calculator:bondetails', args=(regelset.bon.id,)))
else:
print(form.errors)
else:
form = form_choice(product, False, False)
context_dict = {'form': form, 'bon': bon, 'product': product}
return render(request, 'calculator/regelset/regelset_add.html', context_dict)
def alter_regelset(request, regelset_id):
regelset = get_object_or_404(Regelset, pk=regelset_id)
product = regelset.product
bon = get_object_or_404(Bon, pk=regelset.bon_id)
if request.method == 'POST':
form = form_choice(product, regelset, request.POST)
if form.is_valid():
form.save()
wijziging_regelset.delay(regelset.id)
return HttpResponseRedirect(reverse('calculator:bondetails', args=(bon.id,)))
else:
print(form.errors)
else:
form = form_choice(product, regelset, False)
context_dict = {'form': form, 'regelset': regelset}
return render(request, 'calculator/regelset/regelset_wijzig.html', context_dict)
解释:
Regelset = 链接到表单的模型
form_choice:
def form_choice(product, instance, postdata):
toepassing = product.toepassing
afmeting = toepassing.afmeting_verplicht()
# bepaal initial
initial = None
if not instance:
instance = None
if instance is None:
initial = {'type_korting': MenusGlobals.KORT_PROC,
'toepassing': toepassing,
'product': product,
'omslag_dubbelzijdig': product.omslag_dubbelzijdig,
'binnenwerk_dubbelzijdig': product.binnenwerk_dubbelzijdig,
'naam': product.naam,
'originelen': product.get_originelen(),
'oplage': product.get_oplage()}
if toepassing.form_select == MenusGlobals.XL_PRINT:
if afmeting:
initial.update({'breedte_in_cm': product.get_breedte_in_cm(),
'hoogte_in_cm': product.get_hoogte_in_cm()})
elif toepassing.form_select == MenusGlobals.REPRO:
initial.update({'omslag_dubbelzijdig': product.omslag_dubbelzijdig,
'binnenwerk_dubbelzijdig': product.binnenwerk_dubbelzijdig,
'breedte_in_cm': product.get_breedte_in_cm(),
'hoogte_in_cm': product.get_hoogte_in_cm(),
'breedte_in_cm2': product.get_breedte_in_cm2(),
'hoogte_in_cm2': product.get_hoogte_in_cm2()})
# bepaal form
form = RegelsetDataFormXLprintZonderAfmeting(initial=initial, instance=instance)
if postdata:
form = RegelsetDataFormXLprintZonderAfmeting(postdata, initial=initial, instance=instance)
if toepassing.form_select == MenusGlobals.XL_PRINT:
if afmeting:
form = RegelsetDataXLprint(initial=initial, instance=instance)
elif toepassing.form_select == MenusGlobals.REPRO:
alleenbinnenwerk = False
alleenomslag = False
for r in toepassing.toepassingsregel_set.all():
if r.artikelgroep.repro_omslag:
alleenomslag = True
if r.artikelgroep.repro_binnenwerk:
alleenbinnenwerk = True
if alleenbinnenwerk and alleenomslag:
form = RegelsetDataReproBinnenwerkOmslag(initial=initial, instance=instance)
elif alleenbinnenwerk:
form = RegelsetDataReproBinnenwerk(initial=initial, instance=instance)
elif alleenomslag:
form = RegelsetDataReproOmslag(initial=initial, instance=instance)
return form
到目前为止一切顺利...现在问题来了。当 request.method
为 "POST"
.
时,我想使用相同的 form_choice 函数来定义表单变量
到目前为止我尝试的是在 form_choice
函数中将 request.POST 设置为 kwarg
和一个 arg
,像这样
form = form_choice(product, request=request)
并使用 return 正确形式的请求参数,但结果是 SyntaxError
,我不知道为什么。
谁能帮帮我?
更新代码:反映解决方案
我找到了解决办法。我正在使用 *args 和 **kwargs 来传递 request.POST 导致原始数据被放置在元组或字典中的结果。
抱歉给您带来麻烦。我将编辑 post 以反映包括表单选择方法
的解决方案
问题已解决,代码反映了解决方案
对于某种网上商店(有点复杂,但对想法有帮助),我基于同一模型创建了四种不同的表单。 根据产品的不同,我想显示一些字段并隐藏其他字段,并在必要时设置为必需。 注意:它不是一个视图中的多个表单,我只想显示四个表单中的一个
在视图中我有以下代码:
def add_regelset(request, bon_id, product_id):
bon = get_object_or_404(Bon, pk=bon_id)
product = get_object_or_404(Product, pk=product_id)
if request.method == 'POST':
form = form_choice(product, None, request.POST)
if form.is_valid():
formregelset = form.save(commit=False)
formregelset.bon_id = bon.id
formregelset.save()
# Haal de nieuwe regelset op en maak de nodige regels aan
regelset = get_object_or_404(Regelset, id=formregelset.id)
maak_regelset.delay(regelset.id)
return HttpResponseRedirect(reverse('calculator:bondetails', args=(regelset.bon.id,)))
else:
print(form.errors)
else:
form = form_choice(product, False, False)
context_dict = {'form': form, 'bon': bon, 'product': product}
return render(request, 'calculator/regelset/regelset_add.html', context_dict)
def alter_regelset(request, regelset_id):
regelset = get_object_or_404(Regelset, pk=regelset_id)
product = regelset.product
bon = get_object_or_404(Bon, pk=regelset.bon_id)
if request.method == 'POST':
form = form_choice(product, regelset, request.POST)
if form.is_valid():
form.save()
wijziging_regelset.delay(regelset.id)
return HttpResponseRedirect(reverse('calculator:bondetails', args=(bon.id,)))
else:
print(form.errors)
else:
form = form_choice(product, regelset, False)
context_dict = {'form': form, 'regelset': regelset}
return render(request, 'calculator/regelset/regelset_wijzig.html', context_dict)
解释:
Regelset = 链接到表单的模型
form_choice:
def form_choice(product, instance, postdata):
toepassing = product.toepassing
afmeting = toepassing.afmeting_verplicht()
# bepaal initial
initial = None
if not instance:
instance = None
if instance is None:
initial = {'type_korting': MenusGlobals.KORT_PROC,
'toepassing': toepassing,
'product': product,
'omslag_dubbelzijdig': product.omslag_dubbelzijdig,
'binnenwerk_dubbelzijdig': product.binnenwerk_dubbelzijdig,
'naam': product.naam,
'originelen': product.get_originelen(),
'oplage': product.get_oplage()}
if toepassing.form_select == MenusGlobals.XL_PRINT:
if afmeting:
initial.update({'breedte_in_cm': product.get_breedte_in_cm(),
'hoogte_in_cm': product.get_hoogte_in_cm()})
elif toepassing.form_select == MenusGlobals.REPRO:
initial.update({'omslag_dubbelzijdig': product.omslag_dubbelzijdig,
'binnenwerk_dubbelzijdig': product.binnenwerk_dubbelzijdig,
'breedte_in_cm': product.get_breedte_in_cm(),
'hoogte_in_cm': product.get_hoogte_in_cm(),
'breedte_in_cm2': product.get_breedte_in_cm2(),
'hoogte_in_cm2': product.get_hoogte_in_cm2()})
# bepaal form
form = RegelsetDataFormXLprintZonderAfmeting(initial=initial, instance=instance)
if postdata:
form = RegelsetDataFormXLprintZonderAfmeting(postdata, initial=initial, instance=instance)
if toepassing.form_select == MenusGlobals.XL_PRINT:
if afmeting:
form = RegelsetDataXLprint(initial=initial, instance=instance)
elif toepassing.form_select == MenusGlobals.REPRO:
alleenbinnenwerk = False
alleenomslag = False
for r in toepassing.toepassingsregel_set.all():
if r.artikelgroep.repro_omslag:
alleenomslag = True
if r.artikelgroep.repro_binnenwerk:
alleenbinnenwerk = True
if alleenbinnenwerk and alleenomslag:
form = RegelsetDataReproBinnenwerkOmslag(initial=initial, instance=instance)
elif alleenbinnenwerk:
form = RegelsetDataReproBinnenwerk(initial=initial, instance=instance)
elif alleenomslag:
form = RegelsetDataReproOmslag(initial=initial, instance=instance)
return form
到目前为止一切顺利...现在问题来了。当 request.method
为 "POST"
.
到目前为止我尝试的是在 form_choice
函数中将 request.POST 设置为 kwarg
和一个 arg
,像这样
form = form_choice(product, request=request)
并使用 return 正确形式的请求参数,但结果是 SyntaxError
,我不知道为什么。
谁能帮帮我?
更新代码:反映解决方案
我找到了解决办法。我正在使用 *args 和 **kwargs 来传递 request.POST 导致原始数据被放置在元组或字典中的结果。
抱歉给您带来麻烦。我将编辑 post 以反映包括表单选择方法
的解决方案