Изменение поля формы модели django с помощью виджета
Я хочу изменить некоторые поля в форме модели, и я нашел два метода:
Первый метод:
class ProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['bio'].widget.attrs.update({'placeholder': 'Enter your bio here'})
class Meta:
model = Profile
fields = ['bio']
Второй метод:
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['bio']
widgets = {
'bio': Textarea(attrs={'placeholder': 'Enter your bio here'})
Я просто хочу знать, одинаковые ли они? Какой из них лучше? Или есть другой лучший способ?
Спасибо.
Метод 1
Первый метод вызывает конструктор super().__init__(*args, **kwargs)
до манипулирования полем. Это позволяет разработчикам создавать класс в состоянии по умолчанию, а затем играть с компонентами класса (а атрибуты, функции).
Первый метод чаще всего используется, если разработчик не может достичь желаемых результатов в рамках второго метода. Это происходит потому, что вы переходите от конфигурации к манипулированию классом.
Метод 2
Второй метод позволяет разработчикам определять конфигурацию класса до его инстанцирования. Это обычно обеспечивает лучшее удобство использования и читаемость для других разработчиков.
ПРИМЕР:
Допустим, вы хотите, чтобы ваше поле bio
было обязательным для всех обычных пользователей, кроме суперпользователей.
class ProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop(user, None)
super().__init__(*args, **kwargs)
if self.user.is_superuser():
self.fields['bio'].required = False
class Meta:
model = Profile
fields = ['bio']
Используя этот метод, вы можете позволить атрибутам поля Profile
вашей модели bio
переноситься в поле формы при инстанцировании, а затем сделать небольшую настройку, чтобы определить, требуется ли оно для данного пользователя. Это можно сделать без переопределения всего поля.
Примечание: Вызов формы в GET-запросе будет выглядеть как
ProfileForm(user=request.user)