장고 관리자의 필드 크기 조정
Django는 관리자에 대한 항목을 추가하거나 편집할 때 수평 공간을 채우는 경향이 있지만, 경우에 따라 날짜 필드를 8자 너비로 편집하거나 CharField를 6~8자 너비로 편집한 후 편집 상자가 15~20자로 증가할 경우 공간 낭비가 됩니다.
관리자에게 텍스트 상자의 너비 또는 텍스트 필드 편집 상자의 높이를 알려주는 방법은 무엇입니까?
ModelAdmin.formfield_overrides를 사용해야 합니다.
그것은 꽤 쉽습니다 - in.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)
위젯의 "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}}
특정 필드의 너비를 변경합니다.
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
빠르고 더러운 옵션은 해당 모델에 대한 사용자 지정 템플릿을 제공하는 것입니다.
이 이이지정라는 이름의 ,admin/<app label>/<class name>/change_form.html
그러면 관리자가 기본값 대신 해당 템플릿을 사용합니다.즉, 만약 당신이 모델을 가지고 있다면.Person
는 이름의 에서.people
다과같은이템만을다듭니플릿름의라는 이름의 admin/people/person/change_form.html
.
에는 모든관템는이 .extrahead
블록에 물건을 배치하기 위해 재정의할 수 있습니다.<head>
퍼즐의 가 그고퍼즐의마조각은리모를든다분사니있실입가지다는고야가라는 입니다.id_<field-name>
.
따라서 템플릿에 다음과 같은 것을 넣을 수 있습니다.
{% extends "admin/change_form.html" %}
{% block extrahead %}
{{ block.super }}
<style type="text/css">
#id_my_field { width: 100px; }
</style>
{% endblock %}
필드별 인스턴스에서 속성을 변경하려면 "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 마크업을 따라 전달됩니다.각 항목은 재정의할 속성과 재정의할 값의 튜플입니다.각 튜플을 쉼표로 구분하면 원하는 만큼 속성을 입력할 수 있습니다.
제가 찾은 가장 좋은 방법은 다음과 같습니다.
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
폼은 하는 것보다 좋습니다. 폼은 모델양것재훨보좋씬습다니는정을 보존하기 입니다.name
그리고.help_text
모델 필드의 속성 및 기본값을 사용하므로 양식에 복사할 필요가 없습니다.
언제든지 사용자 지정 스타일시트에서 필드 크기를 설정하고 Django에게 ModelAdmin 클래스에 사용하도록 지시할 수 있습니다.
class MyModelAdmin(ModelAdmin):
class Media:
css = {"all": ("my_stylesheet.css",)}
저도 TextField와 비슷한 문제가 있었습니다.저는 장고 1.0.2를 사용하고 있으며 관련 텍스트 영역에서 '행'의 기본값을 변경하고 싶습니다.이 버전에는 formfield_message가 없습니다.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를 사용합니다.저는 이 답변에서 비슷한 질문으로 수정했습니다.
Django FAQ에 잘 설명되어 있습니다.
Q: 모델에서 필드의 위젯 속성을 변경하려면 어떻게 해야 합니까?
A: ModelAdmin/Stacked의 formfield_for_db 필드를 재정의합니다.인라인/표인라인 클래스
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)
1.6의 경우 양식을 사용하여 charfield 내 텍스트 영역의 속성을 지정해야 했습니다.
test1 = forms.CharField(max_length=400, widget=forms.Textarea( attrs={'rows':'2', 'cols': '10'}), initial='', help_text=helptexts.helptxt['test'])
여기 간단하지만 유연한 솔루션이 있습니다.사용자 정의 양식을 사용하여 일부 위젯을 재정의합니다.
# 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
기본 항목을 대체합니다.키는 필드의 문자열 표현입니다.양식에 지정되지 않은 필드는 기본 위젯을 사용합니다.
참고로 비록age
이다.IntegerField
우리는 사용할 수 있습니다.TextInput
위젯, 왜냐하면 그것과는 다르기 때문입니다.NumberInput
,TextInput
를 받아들입니다.size
기여하다.
이 솔루션은 이 문서에 설명되어 있습니다.
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)
선택사항/옵션/드롭다운 메뉴가 포함된 ForeignKey 필드로 작업하는 경우,formfield_for_foreignkey
관리 인스턴스의 경우:
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)
이 패턴에 대한 자세한 내용은 여기와 여기를 참조하십시오.
예를 들어, 다음과 같은 모델이 있습니다.
class Product(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
price = models.DecimalField(decimal_places=2, max_digits=5)
quantity = models.PositiveSmallIntegerField()
def __str__(self):
return self.name
그런 다음 formfield_을(를) 사용하거나 아래의 form을(를) 재정의합니다.
formfield_overrides
:
# "admin.py"
from django.contrib import admin
from .models import Product
from django.db import models
from django import forms
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
formfield_overrides = { # Here
models.CharField: {
'widget': forms.TextInput(attrs={'size':'50'})
},
models.TextField: {
'widget': forms.Textarea(attrs={'rows':'1', 'cols':'50'})
},
models.DecimalField: {
'widget': forms.NumberInput(attrs={'style': 'width:50ch'})
},
models.PositiveSmallIntegerField: {
'widget': forms.NumberInput(attrs={'style': 'width:50ch'})
},
}
form
:
# "admin.py"
from django.contrib import admin
from .models import Product
from django.db import models
from django import forms
class ProductForm(forms.ModelForm):
class Meta:
widgets = {
'name': forms.TextInput(attrs={'size':'50'}),
'description': forms.Textarea(attrs={'rows':'1', 'cols':'50'}),
'price' : forms.NumberInput(attrs={
'style': 'width:50ch'
}),
'quantity' : forms.NumberInput(attrs={
'style': 'width:50ch'
})
}
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
form = ProductForm # Here
form
:
# "admin.py"
from django import forms
from django.contrib import admin
from .models import Product
class ProductForm(forms.ModelForm):
name = forms.CharField(
widget=forms.TextInput(attrs={'size':'50'})
)
description = forms.CharField(
widget=forms.Textarea(attrs={'rows':'1', 'cols':'50'})
)
price = forms.CharField(
widget=forms.NumberInput(attrs={'style':'width:50ch'})
)
quantity = forms.CharField(
widget=forms.NumberInput(attrs={'style':'width:50ch'})
)
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
form = ProductForm # Here
아래와 같이 "추가" 및 "변경" 페이지의 필드 크기를 변경할 수 있습니다.
또한 이 경우에만formfield_overrides
목록 변경 페이지의 필드 크기를 아래와 같이 변경할 수 있습니다.
# "admin.py"
from django.contrib import admin
from .models import Product
from django.db import models
from django import forms
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'description', 'price', 'quantity')
list_editable = ('name',) # Here
list_display_links = ('description',)
formfield_overrides = { # Here
models.CharField: {
'widget': forms.TextInput(attrs={'size':'50'})
},
models.TextField: {
'widget': forms.Textarea(attrs={'rows':'1', 'cols':'50'})
},
models.DecimalField: {
'widget': forms.NumberInput(attrs={'style': 'width:50ch'})
},
models.PositiveSmallIntegerField: {
'widget': forms.NumberInput(attrs={'style': 'width:50ch'})
},
}
그리고 또 다른 예도 있습니다.
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
특정 필드 크기만 편집하려는 경우 이를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/910169/resize-fields-in-django-admin
'programing' 카테고리의 다른 글
VB.net 숫자만 허용하려면 텍스트 상자 필요 (0) | 2023.06.01 |
---|---|
루비에서 예외를 높이는 것과 예외를 던지는 것의 차이점은 무엇입니까? (0) | 2023.06.01 |
VBA의 범위에서 어레이 생성 (0) | 2023.05.27 |
Azure 리소스 그룹의 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.27 |
많은 컬렉션을 바인딩하여 WPF ComboBox 성능 문제 (0) | 2023.05.27 |