如何将 '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 以反映包括表单选择方法

的解决方案