Django: добавление дополнительных атрибутов к полям формы, сгенерированным UpdateView - PullRequest
0 голосов
/ 13 октября 2018

Я использую пользовательского пользователя, который является подклассом Django AbstractUser, и я пытаюсь архивировать, чтобы позволить пользователю обновлять свои данные, все работает, но форма выглядит некрасиво.Ниже мой код атрибут класса не добавляется в форму. forms.py (упрощенно)

class AccountEditForm(forms.ModelForm):
 class Meta:
     model = CustomUser
     fields = ('first_name', 'last_name', 'phone_number', 'date_of_birth', 'country')
     widget = {
         'first_name':forms.TextInput(
             attrs={
                 'class': 'input-bordered',
             }
         )
     }

views.py

class UserAccountDetails(LoginRequiredMixin, UpdateView):

template_name = 'dashboard/account_edit.html'
context_object_name = 'form'
form_class = AccountEditForm
model = CustomUser

def get_object(self, queryset=None):
    """
    Return the object the view is displaying.
    """
    if queryset is None:
        queryset = self.get_queryset()

    #Get logged in user from request data
    queryset = queryset.filter(pk=self.request.user.id)

    try:
        # Get the single item from the filtered queryset
        obj = queryset.get()
    except queryset.model.DoesNotExist:
        raise Http404(_("No %(verbose_name)s found matching the query") %
                    {'verbose_name': queryset.model._meta.verbose_name})
    return obj

1 Ответ

0 голосов
/ 13 октября 2018

Опция widgets предназначена для переопределения значений по умолчанию для явно объявленных полей.Чтобы добавить класс в поле, у вас есть много опций.

Опция # 1: явно объявить поле формы и добавить класс через widgets в Meta.

class AccountEditForm(forms.ModelForm):
    first_name =  forms.TextField(widget=forms.TextInput())

class Meta:
     model = CustomUser
     fields = ('first_name', 'last_name', 'phone_number', 'date_of_birth', 'country')
     widgets = {
         'first_name': forms.TextInput(
             attrs={
                 'class': 'input-bordered',
             }
         )
     }

Опция № 2: более короткая версияопции # 1.

class AccountEditForm(forms.ModelForm):
    first_name =  forms.TextField(widget=forms.TextInput(attrs={'class': 'input-bordered'}))

    class Meta:
        model = CustomUser
        ...

Опция # 3: Добавить класс в метод __init__ формы.

class AccountEditForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(AccountEditForm, self).__init__(*args, **kwargs)
        self.fields['first_name'].widget.attrs['class'] = 'input-bordered'

Опция # 4: Использовать плагин django-widget-tweaks.

...