【问题标题】:How to pass 'request.POST' from views to a function in Django如何将'request.POST'从视图传递到Django中的函数
【发布时间】: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 设置为 kwargarg,如下所示

form = form_choice(product, request=request)

并使用 request 参数返回正确的表单,但结果为SyntaxError,我不知道为什么。

谁能帮帮我?

更新代码:反映解决方案

【问题讨论】:

  • 可以添加form_choice方法吗?
  • form_choice 代码在哪里?并请发布完整的追溯
  • 我找到了解决方案。我使用 *args 和 **kwargs 导致原始数据被放置在元组或字典中。抱歉,添麻烦了。我将编辑帖子以反映解决方案,包括表单选择方法
  • @Sjoerd 最好将答案作为实际答案发布,而不是将其编辑到问题本身中。这样您就可以接受自己的答案,人们会在问题概述中看到问题已解决。

标签: django forms django-forms django-views views


【解决方案1】:

我找到了解决方案。我使用 *args 和 **kwargs 来传递 request.POST 导致原始数据被放置在元组或字典中的结果。

很抱歉给您带来麻烦。我将编辑帖子以反映解决方案,包括表单选择方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2019-08-25
    • 2021-03-26
    • 2018-03-05
    • 2013-06-24
    • 2020-08-09
    • 2018-02-03
    相关资源
    最近更新 更多