Django Admin: Using a custom widget for only one model field

前端 未结 4 1958

I have a DateTimeField field in my model. I wanted to display it as a checkbox widget in the Django admin site. To do this, I created a custom form widget. However, I do not

相关标签:
4条回答
  • 2020-12-04 11:39

    After digging into the admin, model field and form field code, I believe the only way to carry out what I want is by creating a custom model field:

    models.py

    from django.db import models
    from widgets import ApproveStopWidget
    
    class ApproveStopModelField(models.DateTimeField):
        pass
    
    class Stop(models.model):
        # Other fields
        approve_ts = ApproveStopModelField('Approve place', null=True, blank=True)
    

    admin.py

    from widgets import ApproveStopWidget
    from models import ApproveStopModelField
    
    class StopAdmin(admin.ModelAdmin):
        formfield_overrides = {
            ApproveStopModelField: {'widget': ApproveStopWidget }
        }
    

    It gets the job done.

    For the time being, I'll leave the question unanswered because I have the habit of missing the obvious. Perhaps some Django smartypants has a better solution.

    0 讨论(0)
  • Create a custom ModelForm for your ModelAdmin and add 'widgets' to its Meta class, like so:

    class StopAdminForm(forms.ModelForm):
      class Meta:
        model = Stop
        widgets = {
          'approve_ts': ApproveStopWidget(),
        }
        fields = '__all__'
    
    class StopAdmin(admin.ModelAdmin):
      form = StopAdminForm
    

    Done!

    Documentation for this is sort of non-intuitively placed in the ModelForm docs, without any mention to it given in the admin docs. See: Creating forms from models

    0 讨论(0)
  • 2020-12-04 11:42

    Django's ModelAdmin.get_changelist_form(self, request, **kwargs) will do the trick for the case of list_editable

    class StopAdminForm(forms.ModelForm):
      class Meta:
        model = Stop
        widgets = {
          'approve_ts': ApproveStopWidget(),
        }
    
    class StopAdmin(admin.ModelAdmin):
      form = StopAdminForm
    
      #just return the ModelForm class StopAdminForm
      def get_changelist_form(self, request, **kwargs):
            return StopAdminForm
    

    Refer to Django Official documentation on this topic

    I hope this will help

    0 讨论(0)
  • 2020-12-04 11:45

    Override formfield_for_dbfield like thus:

    class VehicleAdmin(admin.ModelAdmin):
        search_fields = ["name", "colour"]
    
        def formfield_for_dbfield(self, db_field, **kwargs):
            if db_field.name == 'colour':
                kwargs['widget'] = ColourChooserWidget
            return super(VehicleAdmin, self).formfield_for_dbfield(db_field,**kwargs)
    

    (credit to http://www.kryogenix.org/days/2008/03/28/overriding-a-single-field-in-the-django-admin-using-newforms-admin/ )

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