python - 使用 1 个按钮 Django 提交 2 个自定义 Crispy 表单

标签 python django django-forms django-templates django-crispy-forms

我有 2 个表单,第二个表单引用第一个表单。我可以使用脆表单正确执行表单,但是,当我使用 helper = FormHelper() 自定义每个表单时,它们将不再一起提交。本质上,一个表单已提交,而另一个表单认为它丢失了所有输入数据。

表单.py

    from django.forms import ModelForm, forms
from .models import Item, Item_dimensions
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Submit, Row, Column


# Create the form class.
class List_Item_Form(ModelForm):
    class Meta:
        model = Item
        exclude = ('id','creator','created_on','updated_on' )

    helper = FormHelper()
    helper.layout = Layout(
        Row(
            Column('item_name', css_class='form-group col-md-6 mb-0'),
            Column('price', css_class='form-group col-md-6 mb-0'),
            css_class='form-row'
        ),
        'short_description',
        'description',
        Row(
            Column('main_image', css_class='form-group col-md-2.5 mb-0'),
            Column('image_2', css_class='form-group col-md-2.5 mb-0'),
            Column('image_3', css_class='form-group col-md-2.5 mb-0'),
            Column('image_4', css_class='form-group col-md-2.5 mb-0'),
            Column('image_5', css_class='form-group col-md-2.5 mb-0'),
            css_class='form-row'
        ),
        'quantity'
    )
    helper.add_input(Submit('submit', 'Submit', css_class='btn-primary'))
    helper.form_method = 'POST'

class List_Item_Dimensions(ModelForm):
    class Meta:
        model = Item_dimensions
        exclude = ('id','item_id')
    helper = FormHelper()
    helper.layout = Layout(
            Row(
                Column('x_dim_mm', css_class='form-group col-md-4 mb-0'),
                Column('y_dim_mm', css_class='form-group col-md-4 mb-0'),
                Column('z_dim_mm', css_class='form-group col-md-4 mb-0'),
                css_class='form-row'
            ),
            'weight_grams',
            Submit('submit', 'add_listing')
        )
    helper.add_input(Submit('submit', 'Submit', css_class='btn-primary'))
    helper.form_method = 'POST'

我尝试过删除

helper.add_input(提交('提交', '提交', css_class='btn-primary'))

只使用一个提交按钮,但不起作用

View .py

@login_required
def AddListing(request):
    if request.method == 'POST':
        form = List_Item_Form(request.POST,request.FILES)
        dim_form = List_Item_Dimensions(request.POST)
        if form.is_valid() and dim_form.is_valid():
            itemName = form.cleaned_data['item_name']
            price = form.cleaned_data['price']
            s_desc = form.cleaned_data['short_description']
            desc = form.cleaned_data['description']
            quantity = form.cleaned_data['quantity']
            main_img = form.cleaned_data['main_image']
            image_2 = form.cleaned_data['image_2']
            image_3 = form.cleaned_data['image_3']
            image_4 = form.cleaned_data['image_4']
            image_5 = form.cleaned_data['image_5']
            x_dim = dim_form.cleaned_data['x_dim_mm']
            y_dim = dim_form.cleaned_data['y_dim_mm']
            z_dim = dim_form.cleaned_data['z_dim_mm']
            weight = dim_form.cleaned_data['weight_grams']
            current_user =  request.user
            

            model_instance = Item(creator=current_user, item_name=itemName, 
                                price=price,short_description=s_desc,
                                description=desc, quantity=quantity,
                                main_image=main_img, image_2=image_2, 
                                image_3=image_3, image_4 = image_4, 
                                image_5=image_5)
            dim_instance = Item_dimensions(x_dim_mm = x_dim,
                                            y_dim_mm =y_dim,
                                            z_dim_mm =z_dim, 
                                            weight_grams = weight)
            model_instance.save()
            # dim_instance.save(commit=False)
            dim_instance.item_id = model_instance
            dim_instance.save()
            return HttpResponseRedirect('/user_profile/items/')
    else:
        form = List_Item_Form()
        dim_form = List_Item_Dimensions()
    return render(request, 'store/add_listing.html', {'form': form,'dim_form':dim_form})

模板.html

{% block content %}
<div>
    <h1> list a new item </h1>
{% load crispy_forms_tags %} 
{% csrf_token %}
<form method="post", enctype="multipart/form-data">{% csrf_token %}
    {% crispy form  %}
    {% crispy dim_form %}
    {% comment %} {{ form|crispy }}
    {{ dim_form|crispy }} {% endcomment %}
    <input name="submit" type="post" value="template button">
</form>
</div>

{% endblock content %}

最佳答案

{% crispy form %}自动添加<form></form>标签,除非您另外指定 form_tag = False 。请参阅https://django-crispy-forms.readthedocs.io/en/latest/form_helper.html

这里您已经给出了外部标签,因此是 crispy其中的标签将创建嵌套表单。这会使您的 HTML 无效。检查https://django-crispy-forms.readthedocs.io/en/latest/crispy_tag_forms.html#crispy-tag-forms

PS:(最近没有使用过 django) - 您不需要在构造函数中包含帮助程序和其他自定义项吗?

关于python - 使用 1 个按钮 Django 提交 2 个自定义 Crispy 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71542177/

相关文章:

javascript - 如何在使用 Javascript 提交之前调整 Django Imagefield 中的图像大小

python - 如果我想从字符串中创建一个树结构?

python - pymatch 在拟合 : Unable to coerce to Series, 长度必须为 1 时给出错误:给定 xxx

python - Python连接MYSQL,获取SP500符号

django - 如何从 HomePage(Page) 重定向到您的自定义应用程序模型

python - Django ModelForm 模板?

javascript - 使用 JQUERY 立即将选中的复选框值从一个复选框复制到另一个复选框

python - 在 Django Admin 中捕获 IntegrityError

python - Heroku部署使用django和gunicorn : Missing gunicorn_django file or dir

django - 从 https 重定向到 https 不起作用。找不到服务器,nginx