【问题标题】:Django - formset with crispy forms - missing management form dataDjango - 带有清晰表单的表单集 - 缺少管理表单数据
【发布时间】:2021-07-13 18:11:15
【问题描述】:

我正在尝试渲染这个表单集:

ProductFormSet = modelformset_factory(
    model=Product,
    fields='__all__',
    extra=5,
)

class ProductFormSetHelper(FormHelper):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form_tag = False
        self.layout = Layout(
            Row(
                'productCategory',
                'name',
                'measurement_unit',
            )
        )
        self.render_required_fields = True

用这种观点:

def product_create(request):
    helper = ProductFormSetHelper()
    context = {
        'helper': helper,
        'title': 'Nuovi Prodotti',
    }
    if request.method == 'GET':
        formset = ProductFormSet(queryset=Product.objects.none())
        context['formset'] = formset

    elif request.method == 'POST':
        formset = ProductFormSet(request.POST)
        context['formset'] = formset
        if formset.is_valid():
            formset.save()
            messages.success(request, 'Prodotti aggiunti correttamente', fail_silently=True)
            return HttpResponseRedirect(reverse('warehouse:products_list'))
        else:
            return render(request, 'warehouse/product_create.html', context)
    return render(request, 'warehouse/product_create.html', context)

还有这个模板:

{% extends "masterpage.html" %}
{% load static %}

{% block headTitle %}
<title>Nuovo Prodotto</title>
{% endblock %}

{% block contentHead %}
{% endblock %}

{% block contentBody %}
{% load document_tags %}
{% load custom_tags %}
{% load crispy_forms_tags %}


<FORM method="POST" autocomplete="off">
    <div class="alert alert-info">
        {{ title }}
    </div>
    {{ formset.management_form }}
    {% crispy formset helper %}
        <input type="submit" class="btn btn-primary margin-left" value="SALVA">
</FORM>

{% endblock %}

问题是,当我提交表单时,我得到:ValidationError: management form data are missing!首先,使用清晰的表单应该包含管理数据,其次,即使我使用标签显式调用,我仍然会得到 ValidationError。

在我在网上搜索的每个论坛中,每个人都缺少管理表单标签,所以我不知道可能出了什么问题....

有什么想法吗?

非常感谢

C

【问题讨论】:

    标签: django django-forms django-crispy-forms formset


    【解决方案1】:

    在您的 Post 方法中,您没有包含“查询集”

    formset = ProductFormSet(queryset=Product.objects.WHATEVER_YOU_CHOOSE, request.POST) 
    

    对于酥脆的形式

                       {% load crispy_forms_tags %} 
    
                       <form method="post">
                            {% csrf_token %}
                            {{ formset|crispy }}
                            {{ formset.management_form }}
                          
                            <input type="submit" class="btn btn-primary margin-left" value="SALVA">
                       </form>
    

    因为你不是在 get_context_data 函数中工作,所以保持简单

    context = {'formset':formset}
    

    文档中的示例

    from django.forms import modelformset_factory
    from django.shortcuts import render
    from myapp.models import Author
    
    def manage_authors(request):
        AuthorFormSet = modelformset_factory(Author, fields=('name', 'title'))
        if request.method == "POST":
            formset = AuthorFormSet(
                request.POST, request.FILES,
                queryset=Author.objects.filter(name__startswith='O'),
            )
            if formset.is_valid():
                formset.save()
                # Do something.
        else:
            formset = AuthorFormSet(queryset=Author.objects.filter(name__startswith='O'))
        return render(request, 'manage_authors.html', {'formset': formset})
    

    【讨论】:

    • 不幸的是它并没有改变任何东西。加上使用 {{ formset|crispy }} 不允许我使用助手来格式化表单(这将显示所有水平字段)。
    • 顺便说一句,{% crispy formset helper%} 自动生成管理数据。我只是仔细检查了网页的源代码。这意味着它们并没有丢失,但是它们已经被破坏了……这就提出了一个问题……这到底是怎么发生的???
    • 还有@taha-maatof,如果我正在使用 Post 数据,为什么我需要指定查询集?我似乎违反直觉,但我可能是错的
    • 我在文档的回答中添加了一些内容,以澄清 POST 方法 docs.djangoproject.com/fr/3.2/topics/forms/modelforms,希望对您有所帮助
    • 对于模板,我使用的正是我在答案中写的,它工作正常,很抱歉我不知道为什么它在你的情况下不起作用
    【解决方案2】:

    希望它可以帮助其他人。由于在配置千位分隔符时遇到问题,我尝试通过添加 |intcomma 过滤器来更改 /templates/django/forms/widgets 中的 input.html 小部件。 这改变了管理表单数据(一个字段默认设置为 1000),从而破坏了整个表单。

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2014-07-16
      • 2014-12-27
      • 2015-04-14
      • 2010-09-23
      • 2013-10-27
      相关资源
      最近更新 更多