#python #django #custom-fields
#python #django #пользовательские поля
Вопрос:
У меня есть регистрационная форма, я использую crispy. Я хочу, чтобы поля ввода выглядели лучше, поэтому я хотел добавить класс к каждому из них, но сайт отображает только первое поле ввода с классом. (Это мой первый проект django, поэтому я довольно новичок в этом)
Вот мой forms.py файл:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
widgets = {
'username': forms.TextInput(attrs={'class': 'form-control input'}),
'email': forms.EmailInput(attrs={'class': 'form-control input'}),
'password1': forms.PasswordInput(attrs={'class': 'form-control input'}),
'password2': forms.PasswordInput(attrs={'class': 'form-control input'}),
}
Вот шаблон:
<div class="sign-up">
<form class="form" method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4, sign-up__header">Join Today</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Sign up</button>
</div>
</form>
</div>
Ответ №1:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Submit, Row, Column
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
Row(
Column('username', css_class='form-group col-md-3 mb-0 input'),
Column('email', css_class='form-group col-md-3 mb-0 input'),
Column('password1', css_class='form-group col-md-3 mb-0 input'),
Column('password2', css_class='form-group col-md-3 mb-0 input'),
css_class='form-row'
)
)
Более подробную информацию см. в этом документе
Комментарии:
1. Я пробовал это, но все равно он применяет стили только к полю имени пользователя
Ответ №2:
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
#override
def __init__(self, *args, **kwargs):
super(UserRegisterForm, self).__init__(*args, **kwargs)
#Custom classok
self.fields['username'].widget.attrs['class'] = 'input'
self.fields['email'].widget.attrs['class'] = 'input'
self.fields['password1'].widget.attrs['class'] = 'input'
self.fields['password2'].widget.attrs['class'] = 'input'