【问题标题】:Django - Can a crispy form be split into 2 columns?Django - 可以将酥脆的表格分成 2 列吗?
【发布时间】:2019-09-09 22:51:33
【问题描述】:

我正在尝试将一个清晰的布局表单拆分为 2 列以尝试消除滚动的需要,我尝试在 forms.py 中使用 formhelper 将 2 个问题放在 DIV 中,但这并没有改变任何东西.有没有人有任何想法?

forms.py

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Field, Row, Submit, Button, Column

class ProfileUpdateForm(forms.ModelForm):
    address = forms.CharField()
    dob = forms.DateField(
        widget=forms.TextInput(
            attrs={'type': 'date'}
        ), label='Date of Birth'
    )
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Div(
                Div(Field('fullname'), css_class='col-md-6',),
                Div(Field('dob'), css_class='col-md-6',),
                css_class='row',
            ),
            Div(
                Div(Field('address'), css_class='col-md-6',),
                Div(Field('city'), css_class='col-md-6',),
                css_class='row',
            ),
            Div(
                Div(Field('country'), css_class='col-md-6',),
                Div(Field('profilephoto'), css_class='col-md-6',),
                css_class='row',
            ),
        )
        super(ProfileUpdateForm, self).__init__(*args, **kwargs)
    class Meta:
        model = Profile
        fields = ['fullname', 'dob', 'address', 'city', 'country', 'profilephoto']
        labels = {
            'fullname': 'Full Name',
            'address': 'Address',
            'city': 'City',
            'country': 'Country',
            'profilephoto': 'Profile Photo',
        }

views.py

@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)

        if u_form.is_valid and p_form.is_valid:
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been successfully updated!')
            return redirect('profile')
    else:   
        u_form = UserUpdateForm(instance = request.user)
        p_form = ProfileUpdateForm(instance = request.user.profile)

    context = {
        'u_form': u_form,
        'p_form': p_form
    }
    return render(request, 'users/profile.html', context)

profile.html

{% load crispy_forms_tags %}

            <form method="POST" enctype="multipart/form-data">
                {% csrf_token %}
                {{ u_form|crispy }}

                {{ p_form|crispy }}

           </form>

当前状态

编辑 将 __init__ 添加到 forms.py

【问题讨论】:

    标签: python django django-forms django-templates


    【解决方案1】:

    实际上,我什至不确定您的助手是否被接走。基于documentation here,formhelper 应添加到__init__。如果您不在那里使用{% crispy your_cool_form_name %},您的问题也可能在您的模板中。

    你快到了。你是looking for Field

    from crispy_forms.layout import Field
    
    [...]
    
    
    Div(
        Div(Field('fullname'), css_class='col-md-6',),
        Div(Field('dob'), css_class='col-md-6',),
        css_class='row',
    ),
    

    【讨论】:

    • 所以我在字段名称前添加了字段标签但没有任何改变,我不确定如何执行 init 方法。
    • 再次阅读the fundamentals。他们有两个__init__ 示例。
    • 我已经更新了帖子,展示了我是如何做到的,但仍然没有进行任何更改。
    • 在您的模板中使用标签{% cirspy u_form %} 代替过滤器{{ u_form|crispy }}
    • 它是{% crispy p_form %},但它确实有效!非常感谢!
    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 2018-01-16
    • 2021-07-07
    • 2016-01-29
    • 2019-03-17
    • 2014-06-11
    • 2019-12-21
    • 2012-12-06
    相关资源
    最近更新 更多