【发布时间】:2015-11-09 22:03:42
【问题描述】:
问题已解决,代码反映解决方案
对于某种网上商店(它有点复杂,但有助于实现这个想法),我基于相同的模型创建了四种不同的表单。 根据产品,我想显示一些字段并隐藏其他字段并在必要时设置为必需。 注意:它不是一个视图中的多个表单,我想只显示四个表单中的一个
在视图中我有以下代码:
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)
并使用 request 参数返回正确的表单,但结果为SyntaxError,我不知道为什么。
谁能帮帮我?
更新代码:反映解决方案
【问题讨论】:
-
可以添加
form_choice方法吗? -
form_choice 代码在哪里?并请发布完整的追溯
-
我找到了解决方案。我使用 *args 和 **kwargs 导致原始数据被放置在元组或字典中。抱歉,添麻烦了。我将编辑帖子以反映解决方案,包括表单选择方法
-
@Sjoerd 最好将答案作为实际答案发布,而不是将其编辑到问题本身中。这样您就可以接受自己的答案,人们会在问题概述中看到问题已解决。
标签: django forms django-forms django-views views