Django 表单和内联表单,具有清晰的表单布局

问题描述 投票:0回答:1

我有一个带有来自“脆皮表单”的自定义布局的表单和一个手动在 HTML 中的内联表单。如果我不使用自定义布局,我可以毫无问题地保存两者,但是我需要创建一个按钮来使用布局一起提交表单。

这是我的 HTML:

<form id="registro-form" class="main-form" action="?" method="POST">
    <!-- Main Form -->
    {% csrf_token %}
    {% crispy form %}
    
    <hr>
    
    <!-- Inline Formset -->
    {{ itens_formset.management_form }}
    {% for formset_form in itens_formset %}
        <div class="inline-formset-item">
            <!-- Render inline formset fields manually -->
            <div class="row no-gutters">
                <!-- Render formset fields here -->
            </div>
        </div>
    {% endfor %}
    
    <!-- Submit Button -->
    <button class="btn btn-success mt-2 mb-5" type="submit" style="width: 110px;">Salvar</button>
</form>

这是我目前的html代码,但是当我单击提交按钮时,没有任何反应。

这是我的观点.py:

class RegistrarCreate(GroupRequiredMixin, CreateView):
    # GroupRequiredMixin and other attributes
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        ItemFormSet = inlineformset_factory(Registro, Item, form=ItemForm, extra=1, can_delete=False)
        
        if self.request.POST:
            context['itens_formset'] = ItemFormSet(self.request.POST, instance=self.object)
        else:
            context['itens_formset'] = ItemFormSet(instance=self.object)

        return context

    def form_valid(self, form):
        context = self.get_context_data()
        itens_formset = context['itens_formset']

        if itens_formset.is_valid():
            self.object = form.save()
            itens_formset.instance = self.object
            itens_formset.save()
            return super().form_valid(form)
        else:
            print("Formset is invalid")
            print(itens_formset.errors)
            return self.render_to_response(self.get_context_data(form=form))

    def get(self, request, *args, **kwargs):
        self.object = None
        return super().get(request, *args, **kwargs)

这是我的forms.py:

class RegistroForm(forms.ModelForm):
    class Meta:
        model = Registro
        fields = ['tipo', 'vendedor', 'nome', 'cpf', 'email', 'rg', 'cidade', 'telefone', 'numero', 'rua', 'bairro', 'data']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Personalize o layout dos campos usando Crispy Forms
        self.helper = FormHelper()
        self.helper.form_class = 'form'
        self.helper.layout = Layout(
            Div(
                Div(Field('tipo', css_class='form-control'), css_class='col-md-5'),
                Div(css_class='col-md-2'),
                Div(HTML("<h4>N° {{ registro_format }}</h4>"), css_class='col-md-5 mt-4'),
                css_class='row'
            ),
            Div(
                Div(Field('nome', css_class='form-control'), css_class='col-md-5'),
                Div(css_class='col-md-2'),
                Div(Field('cpf', css_class='form-control'), css_class='col-md-5'),
                css_class='row'
            ),
            Div(
                Div(Field('email', css_class='form-control'), css_class='col-md-5'),
                Div(css_class='col-md-2'),
                Div(Field('rg', css_class='form-control'), css_class='col-md-5'),
                css_class='row'
            ),
            Div(
                Div(Field('vendedor', css_class='form-control'), css_class='col-md-5'),
                Div(css_class='col-md-2'),
                Div(Field('data', css_class='form-control'), css_class='col-md-5'),
                css_class='row'
            ),
            Div(
                Div(Field('cidade', css_class='form-control'), css_class='col-md-5'),
                Div(css_class='col-md-2'),
                Div(Field('telefone', css_class='form-control'), css_class='col-md-5'),
                css_class='row'
            ),
            Div(
                Div(Field('numero', css_class='form-control'), css_class='col-md-5'),
                Div(css_class='col-md-2'),
                Div(Field('rua', css_class='form-control'), css_class='col-md-5'),
                css_class='row'
            ),
            Div(
                Div(Field('bairro', css_class='form-control'), css_class='col-md-5'),
                css_class='row'
            ),
        )

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ['quantidade', 'tamanho','valorProd', 'valor_total']

我尝试过的:我尝试在布局中编写提交按钮,但是itens的信息没有被传递,程序返回一个空列表

django django-forms django-crispy-forms inline-formset
1个回答
0
投票

尝试添加无效函数来打印表单错误。

def form_invalid(self, form):
    print(form.errors)
    return self.render_to_response(self.get_context_data(form=form))

这应该显示表格中的任何错误。

© www.soinside.com 2019 - 2024. All rights reserved.