Django Admin - Overriding the widget of a custom form field

前端 未结 4 1132
旧巷少年郎
旧巷少年郎 2020-12-02 14:54

I have a custom TagField form field.

class TagField(forms.CharField):
    def __init__(self, *args, **kwargs):
        super(TagField, self).__init__(*args,          


        
相关标签:
4条回答
  • 2020-12-02 15:07

    You can override field widgets by extending ModelForm Meta class since Django 1.2:

    class ProductAdminForm(forms.ModelForm):
        class Meta:
            model = Product
            widgets = {
                'tags': admin.widgets.AdminTextareaWidget
            }
    
    class ProductAdmin(admin.ModelAdmin):
        form = ProductAdminForm
    

    https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields

    0 讨论(0)
  • 2020-12-02 15:15

    The django admin uses custom widgets for many of its fields. The way to override fields is to create a Form for use with the ModelAdmin object.

    # forms.py
    
    from django import forms
    from django.contrib import admin
    
    class ProductAdminForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(ProductAdminForm, self).__init__(*args, **kwargs)
            self.fields['tags'].widget = admin.widgets.AdminTextareaWidget()
    

    Then, in your ModelAdmin object, you specify the form:

    from django.contrib import admin
    from models import Product
    from forms import ProductAdminForm
    
    class ProductAdmin(admin.ModelAdmin):
        form = ProductAdminForm
    
    admin.site.register(Product, ProductAdmin)
    

    You can also override the queryset at this time: to filter objects according to another field in the model, for instance (since limit_choices_to cannot handle this)

    0 讨论(0)
  • 2020-12-02 15:15

    For a specific field not a kind of fields I use:

    Django 2.1.7

    class ProjectAdminForm(forms.ModelForm):
        class Meta:
            model = Project
            fields = '__all__'
            widgets = {
                'project_description': forms.Textarea(attrs={'cols': 98})
            }
    
    class ProjectAdmin(admin.ModelAdmin):
        form = ProjectAdminForm
    

    Thanks, @Murat Çorlu

    0 讨论(0)
  • 2020-12-02 15:19

    Try to change your field like this:

    class TagField(forms.CharField):
        def __init__(self, *args, **kwargs):
            self.widget = forms.TextInput(attrs={'class':'tag_field'})
            super(TagField, self).__init__(*args, **kwargs)
    

    This would allow to use the widget which comes from **kwargs. Otherwise your field will always use form.TextInput widget.

    0 讨论(0)
提交回复
热议问题