Django — Можно ли разделить хрустящую форму на 2 столбца?

#python #django #django-forms #django-templates

#python #django #django-forms #django-шаблоны

Вопрос:

Я пытаюсь разделить хрустящую форму макета на 2 столбца, чтобы попытаться устранить необходимость прокрутки, я пытался использовать formhelper в forms.py поместить 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

Ответ №1:

На самом деле, я даже не уверен, подобран ли ваш помощник. На основе документации здесь formhelper следует добавить в __init__ . И ваша проблема также может быть в вашем шаблоне, если вы там не используете {% crispy your_cool_form_name %} .

Вы почти на месте. Вы ищете 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',
),
 

Комментарии:

1. Итак, я добавил тег поля перед именем поля, но ничего не изменилось, я не уверен, как выполнить метод инициализации .

2. Прочитайте основы еще раз. У них есть два __init__ примера.

3. Я обновил сообщение, показывающее, как я это сделал, но по-прежнему никаких изменений не внесено.

4. Вместо фильтра {{ u_form|crispy }} используйте тег {% cirspy u_form %} в вашем шаблоне.

5. Это {% crispy p_form %} , но да, это работает! Большое вам спасибо!