【问题标题】:Django: Add extra attributes to form fields generated by UpdateViewDjango:为 UpdateView 生成的表单字段添加额外的属性
【发布时间】:2019-03-18 07:14:45
【问题描述】:

我正在使用一个自定义用户,它是 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

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    widgets 选项用于覆盖显式声明字段的默认值。要将类添加到该字段,您有很多选择。

    选项#1:在Meta中显式声明表单字段并通过widgets添加类。

    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 插件。

    【讨论】:

    • 感谢您支持您的sn-p揭示我的错误,但您不必定义。
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 2011-07-04
    • 2012-11-13
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2019-12-30
    • 2011-07-02
    相关资源
    最近更新 更多