کار با widget ها در django

با سلام و درود 🙂

تو این مقاله میخوام یه مقدار در مورد widget ها در django حرف بزنم. شالوده اصلی مطالب این مقاله از اسناد خود django گرفته شده (از اینجا).

ما با widget ها د ر django روی ظاهر Html فرم ها یه مقدار میتونیم دست کاری داشته باشیم. در حقیقت روی render کردن Html دسترسی پیدا می کنیم.

Html های ساخته شده توسط ویدجت های داخلی خود دیجنگو از سینتکس های Html5 استفاده می کنند.

نکته : ویدجت ها را با form field ها اشتباه نگیرید. ویدجت ها بر روی form field ها اعمال می شوند و صرفا با render کردن Html روی صفحه وب سر و کار دارند اما فیلد های فرم مستقیما در template ها استفاده می شوند و با منطق ارزیابی ورودی (input validation) سر و کار دارند.

همین که شما فیلدی را داخل یک فرم تعیین می کنید. دیجنگو به صورت پیش فرض از ویدجتی مناسب با نوع داده ای که باید نمایش داده شود استفاده می کند. برای مشاهده widget ها و فیلد های متناظرشون اینجا رو یه نگاه بیاندازید.

به هر حال اگر شما میخواهید یه widget دلخواه و متفاوت برای یه فیلد استفاده کنید، کافیه از آرگومان widget به هنگام تعریف فیلد استفاده کنید، برای مثال :

from django import forms

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField(widget=forms.Textarea)

در مثال فوق فرمی با کامنت ساخته می شود که از ویدجت Textarea بزرگنتر از ویدجت پیشفرض TextInput استفاده می کند.

تنظیم آرگومان برای ویدجت ها در دیجنگو:

تعدادی از ویدجت ها دارای آرگومان های آپشنال هستند که به هنگام تعریف ویدجت روی یک فیلد میتوان آنها را تنظیم کرد. در مثال ذیل، ویژگی  years برای SelectDateWidget تنظیم شده است:

from django import forms

BIRTH_YEAR_CHOICES = ['1980', '1981', '1982']
FAVORITE_COLORS_CHOICES = [
    ('blue', 'Blue'),
    ('green', 'Green'),
    ('black', 'Black'),
]

class SimpleForm(forms.Form):
    birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))
    favorite_colors = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=FAVORITE_COLORS_CHOICES,
    )

برای مشاهده widget های داخلی به اینجا یه نگاهی بیاندازید (البته در انتهای این مقاله بهشون یه اشاره ای خواهد شد)

تغییرو شخصی سازی widget ها در django :

برای (customizing) شما می توانید ویژگی هایی را برای هر widget در نظر بگیرید تا اون widget برای شما مشخص و متفاوت باشد، برای مثال widget مربوط به comment رو سایزش بزرگتری براش در نظر بگیرید. برای این کار کافیست از آرگومان Widget.attrs به هنگام ساخت widgetاستفاده کنید:

class CommentForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
    url = forms.URLField()
    comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))

یا :

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField()

    name.widget.attrs.update({'class': 'special'})
    comment.widget.attrs.update(size='40')

یا اگر فیلد مستقیما از روی مدل گرفته شده باشه، می توانید به روش زیر اقدام کنید :

class CommentForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'].widget.attrs.update({'class': 'special'})
        self.fields['comment'].widget.attrs.update(size='40')

با استفادهاز widget ها شما می توانید از css و javascript ها استفاده کنید و تا می توانید ظاهر و باطن کد خودتون رو کاستوم کنید.