#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 %}
, но да, это работает! Большое вам спасибо!