Django는 관리자에서 항목을 추가하거나 편집 할 때 가로 공간을 채우는 경향이 있지만, 경우에 따라 날짜 필드, 8 자 너비 또는 CharField, 6 또는 8을 편집 할 때 공간 낭비가됩니다. 문자가 넓고 편집 상자는 최대 15 자 또는 20 자까지 표시됩니다.
관리자에게 텍스트 상자의 너비 또는 텍스트 필드 편집 상자의 높이를 어떻게 알릴 수 있습니까?
답변
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)
답변
“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>
과 퍼즐의 마지막 조각은 모든 필드의 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 %}
답변
필드 별 인스턴스의 속성을 변경하려는 경우 “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
ModelForm은 다른 위젯으로 필드를 재정의하는 것보다 훨씬 낫습니다. 모델 필드의 기본값 name
과 help_text
속성을 보존 하므로 양식에 복사 할 필요가 없기 때문입니다.
답변
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를 사용합니다. 이 답변 에서 비슷한 질문에 적용했습니다 .
