Programing

Django Admin : 하나의 모델 필드에만 사용자 정의 위젯 사용

crosscheck 2020. 12. 10. 18:50
반응형

Django Admin : 하나의 모델 필드에만 사용자 정의 위젯 사용


나는이 DateTimeField의 내 모델에서 필드. Django 관리 사이트에서 체크 박스 위젯으로 표시하고 싶었습니다. 이를 위해 사용자 지정 양식 위젯을 만들었습니다. 그러나이 하나의 필드 에만 사용자 정의 위젯을 사용하는 방법을 모릅니다 .

장고 문서 에 대한 사용자 정의 위젯을 사용하는 방법에 대해 설명 모든 특정 유형의 필드 :

class StopAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.DateTimeField: {'widget': ApproveStopWidget }
    }

그러나 이것은 충분히 세분화되지 않았습니다. 필드 에 대해서만 변경하고 싶습니다 .


ModelAdmin에 대한 사용자 정의 ModelForm을 만들고 다음과 같이 Meta 클래스에 '위젯'을 추가합니다.

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

class StopAdmin(admin.ModelAdmin):
  form = StopAdminForm

끝난!

이에 대한 문서는 관리자 문서에 언급 된 언급없이 ModelForm 문서에 직관적이지 않게 배치됩니다. 참조 : 모델에서 양식 생성


파고 후 관리 , 모델 필드양식 필드 코드는 내가 유일한 방법은 내가 정의 모델 필드를 만드는 것입니다 원하는 것을 수행하기 위해 생각 :

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 }
    }

작업이 완료됩니다.

당분간 나는 명백한 것을 놓치는 습관이 있기 때문에 질문에 답하지 않을 것입니다. 아마도 일부 Django smartypants가 더 나은 솔루션을 가지고있을 것입니다.


다음과 같이 formfield_for_dbfield를 재정의합니다.

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)

( http://www.kryogenix.org/days/2008/03/28/overriding-a-single-field-in-the-django-admin-using-newforms-admin/에 대한 크레딧 )


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

참고URL : https://stackoverflow.com/questions/4176613/django-admin-using-a-custom-widget-for-only-one-model-field

반응형