Django Admin에서 필드 크기 조정


108

Django는 관리자에서 항목을 추가하거나 편집 할 때 가로 공간을 채우는 경향이 있지만, 경우에 따라 날짜 필드, 8 자 너비 또는 CharField, 6 또는 8을 편집 할 때 공간 낭비가됩니다. 문자가 넓고 편집 상자는 최대 15 자 또는 20 자까지 표시됩니다.

관리자에게 텍스트 상자의 너비 또는 텍스트 필드 편집 상자의 높이를 어떻게 알릴 수 있습니까?


9
분명히이 경우에는 그렇게하는 것을 잊었습니다. 2 년 이상 후. =)
casperOne

프로젝트가 버려졌고 한동안 코드를 볼 필요가 없었습니다. 다음 달에 새 프로젝트를 시작할 수 있으므로 다시 설정할 수 있습니다. D
Andor

답변:


210

ModelAdmin.formfield_overrides를 사용해야합니다 .

매우 쉽습니다-에서 admin.py정의하십시오.

from django.forms import TextInput, Textarea
from django.db import models

class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'20'})},
        models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})},
    }

admin.site.register(YourModel, YourModelAdmin)

1
이것은 터무니없는 템플릿 사용자 정의를 만들지 않고도 정확히 내가 찾고 있던 것입니다. 감사!
크리스

2
경우이 작동하지 않습니다 filter_horizontal또는 filter_verticalYourModelAdmin에서 해당 필드에 대해 설정됩니다. 나는 이것을 알아 내기 위해 약간의 시간을 보냈다.
Dennis Golomazov 2013 년

이것에 대한 형식이 있습니까? 모든 Textareas에 attrs 속성을 설정하는 방법을 찾지 못했습니다.
줄리안

1
나는 단지 사용 models.TextField: {'widget': Textarea(attrs={'rows':4})}했지만 너비도 작아졌습니다.
Smit Johnth

분명히 같은 크기를 갖기는 어렵습니다.
Sören

45

"attrs"속성을 사용하여 위젯에 임의의 HTML 속성을 설정할 수 있습니다 .

Django 관리자에서 formfield_for_dbfield를 사용하여이 작업을 수행 할 수 있습니다.

class MyModelAdmin(admin.ModelAdmin):
  def formfield_for_dbfield(self, db_field, **kwargs):
    field = super(ContentAdmin, self).formfield_for_dbfield(db_field, **kwargs)
    if db_field.name == 'somefield':
      field.widget.attrs['class'] = 'someclass ' + field.widget.attrs.get('class', '')
    return field

또는 사용자 정의 위젯 하위 클래스 및 formfield_overrides 사전 과 함께 :

class DifferentlySizedTextarea(forms.Textarea):
  def __init__(self, *args, **kwargs):
    attrs = kwargs.setdefault('attrs', {})
    attrs.setdefault('cols', 80)
    attrs.setdefault('rows', 5)
    super(DifferentlySizedTextarea, self).__init__(*args, **kwargs)

class MyModelAdmin(admin.ModelAdmin):
  formfield_overrides = { models.TextField: {'widget': DifferentlySizedTextarea}}

30

특정 필드의 너비를 변경하려면.

ModelAdmin.get_form을 통해 작성 :

class YourModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(YourModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['myfield'].widget.attrs['style'] = 'width: 45em;'
        return form

제 생각에는 새 양식을 만들지 않고도 개별 필드를 변경할 수 있기 때문에 이것이 최선의 대답입니다.
rbennell

21

빠르고 더러운 옵션은 해당 모델에 대한 사용자 지정 템플릿을 제공하는 것입니다.

이름이 지정된 템플릿을 생성 admin/<app label>/<class name>/change_form.html하면 관리자는 기본값 대신 해당 템플릿을 사용합니다. 즉, 이름이라는 Person앱에 이름이 지정된 모델이있는 경우 라는 people템플릿을 만듭니다 admin/people/person/change_form.html.

모든 관리 서식은이 extrahead당신이에서 개최 물건으로 대체 할 수 있습니다 블록 <head>과 퍼즐의 마지막 조각은 모든 필드의 HTML ID를 가지고 있다는 사실이다 id_<field-name>.

따라서 템플릿에 다음과 같은 내용을 넣을 수 있습니다.

{% extends "admin/change_form.html" %}

{% block extrahead %}
  {{ block.super }}
  <style type="text/css">
    #id_my_field { width: 100px; }
  </style>
{% endblock %}

감사! 이것과 alanjds의 대답은 필드 유형별로가 아닌 필드별로 관리 인터페이스에서 레이아웃을 변경하는 데 매우 유용합니다.
nealmcb 2014-08-22

10

필드 별 인스턴스의 속성을 변경하려는 경우 "attrs"속성을 양식 항목에 직접 추가 할 수 있습니다.

예를 들면 :

class BlogPostForm(forms.ModelForm):
    title = forms.CharField(label='Title:', max_length=128)
    body = forms.CharField(label='Post:', max_length=2000, 
        widget=forms.Textarea(attrs={'rows':'5', 'cols': '5'}))

    class Meta:
        model = BlogPost
        fields = ('title', 'body')

"attrs"속성은 기본적으로 양식 필드를 조정하는 HTML 마크 업을 전달합니다. 각 항목은 재정의하려는 속성과 재정의하려는 값의 튜플입니다. 각 튜플을 쉼표로 구분하는 한 원하는만큼 속성을 입력 할 수 있습니다.


IMO는 한 번에 모든 TextInput-widget이 아닌 단일 필드 만 수정하는 가장 좋은 방법입니다 (허용 된 답변처럼)
ascripter

7

내가 찾은 가장 좋은 방법은 다음과 같습니다.

class NotificationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs): 
        super(NotificationForm, self).__init__(*args, **kwargs)
        self.fields['content'].widget.attrs['cols'] = 80
        self.fields['content'].widget.attrs['rows'] = 15
        self.fields['title'].widget.attrs['size'] = 50
    class Meta:
        model = Notification

ModelForm은 다른 위젯으로 필드를 재정의하는 것보다 훨씬 낫습니다. 모델 필드의 기본값 namehelp_text속성을 보존 하므로 양식에 복사 할 필요가 없기 때문입니다.


7

TextField와 비슷한 문제가 있습니다. Django 1.0.2를 사용하고 있으며 관련 텍스트 영역에서 '행'의 기본값을 변경하고 싶습니다. 이 버전에는 formfield_overrides가 없습니다. formfield_for_dbfield를 재정의하면 효과가 있었지만 각 ModelAdmin 하위 클래스에 대해 수행해야했습니다. 그렇지 않으면 재귀 오류가 발생합니다. 결국 아래 코드를 models.py에 추가하면 작동한다는 것을 알았습니다.

from django.forms import Textarea

class MyTextField(models.TextField):
#A more reasonably sized textarea                                                                                                            
    def formfield(self, **kwargs):
         kwargs.update(
            {"widget": Textarea(attrs={'rows':2, 'cols':80})}
         )
         return super(MyTextField, self).formfield(**kwargs)

그런 다음 모델을 정의 할 때 TextField 대신 MyTextField를 사용합니다. 이 답변 에서 비슷한 질문에 적용했습니다 .


5

Django FAQ에 잘 설명되어 있습니다 .

Q : 모델의 필드에서 위젯 속성을 변경하려면 어떻게해야합니까?

A : ModelAdmin / StackedInline / TabularInline 클래스에서 formfield_for_dbfield를 재정의합니다 .

class MyOtherModelInline(admin.StackedInline):
    model = MyOtherModel
    extra = 1

    def formfield_for_dbfield(self, db_field, **kwargs):
        # This method will turn all TextFields into giant TextFields
        if isinstance(db_field, models.TextField):
            return forms.CharField(widget=forms.Textarea(attrs={'cols': 130, 'rows':30, 'class': 'docx'}))
        return super(MyOtherModelInline, self).formfield_for_dbfield(db_field, **kwargs)

이 기술을 사용하면 도움말 텍스트가 나타나지 않고 TabularInline 인 경우 열 머리글이 '없음'이됩니다.
Steven T. Snyder

1
CharField의 다른 모든 설정을 지우므로 이것은 좋은 접근 방식이 아닙니다. 예를 들어 기본적으로 양식 필드가 필요한지 여부를 지능적으로 감지하지만이 코드는이를 파괴합니다. 대신 super () 호출에 의해 반환 된 값에 위젯을 설정해야합니다.
Cerin

5

언제든지 커스텀 스타일 시트에서 필드 크기를 설정하고 Django에게 ModelAdmin 클래스에 사용하도록 지시 할 수 있습니다.

class MyModelAdmin(ModelAdmin):
    class Media:
        css = {"all": ("my_stylesheet.css",)}

베스트 답변! 양식 필드와 속성 (및 가능한 부작용)을 조작하지 않고 css 파일 만 있으면 django 관리 양식의 기존 ID / 클래스를 사용하여 일부 또는 모든 필드 만 쉽게 대상으로 지정할 수 있습니다. 크게!
benzkji

2

1.6의 경우 양식을 사용하여 charfield 내부의 텍스트 영역 속성을 지정해야했습니다.

test1 = forms.CharField(max_length=400, widget=forms.Textarea( attrs={'rows':'2', 'cols': '10'}),  initial='', help_text=helptexts.helptxt['test'])

1

msdin과 같은 대답이지만 TextArea 대신 TextInput을 사용합니다.

from django.forms import TextInput

class ShortTextField(models.TextField):
    def formfield(self, **kwargs):
         kwargs.update(
            {"widget": TextInput(attrs={'size': 10})}
         )
         return super(ShortTextField, self).formfield(**kwargs)

1

다음은 간단하면서도 유연한 솔루션입니다. 사용자 지정 양식을 사용하여 일부 위젯을 재정의합니다.

# models.py
class Elephant(models.Model):
    name = models.CharField(max_length=25)
    age = models.IntegerField()

# forms.py
class ElephantForm(forms.ModelForm):

    class Meta:
        widgets = {
            'age': forms.TextInput(attrs={'size': 3}),
        }

# admin.py
@admin.register(Elephant)
class ElephantAdmin(admin.ModelAdmin):
    form = ElephantForm

제공된 위젯 ElephantForm이 기본 위젯 을 대체합니다. 키는 필드의 문자열 표현입니다. 양식에 지정되지 않은 필드는 기본 위젯을 사용합니다.

하지만 참고 ageIntegerField우리가 사용할 수있는 TextInput달리하기 때문에, 위젯 NumberInput, TextInput허용 size속성을.

이 솔루션은 이 문서에서 설명 합니다.


0

선택 항목 / 옵션 / 드롭 다운 메뉴가 포함 된 ForeignKey 필드로 작업하는 formfield_for_foreignkey경우 Admin 인스턴스에서 재정의 할 수 있습니다 .

class YourNewAdmin(admin.ModelAdmin):
    ...

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'your_fk_field':
            """ For your FK field of choice, override the dropdown style """
            kwargs["widget"] = django.forms.widgets.Select(attrs={
                'style': 'width: 250px;'
            })

        return super().formfield_for_foreignkey(db_field, request, **kwargs)

이 패턴에 대한 자세한 정보는 여기여기 .


-1

그리고 또 하나의 예 :

class SecenekInline(admin.TabularInline):
   model = Secenek
   # classes = ['collapse']
   def formfield_for_dbfield(self, db_field, **kwargs):
       field = super(SecenekInline, self).formfield_for_dbfield(db_field, **kwargs)
       if db_field.name == 'harf':
           field.widget = TextInput(attrs={'size':2})
       return field
   formfield_overrides = {
       models.TextField: {'widget': Textarea(attrs={'rows':2})},
   }
   extra = 2

특정 필드 크기 만 편집하려는 경우이를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.