yo tengo
class Cab(models.Model):
name = models.CharField( max_length=20 )
descr = models.CharField( max_length=2000 )
class Cab_Admin(admin.ModelAdmin):
ordering = ('name',)
list_display = ('name','descr', )
# what to write here to make descr using TextArea?
admin.site.register( Cab, Cab_Admin )
¿Cómo asignar el widget TextArea al campo 'descr' en la interfaz de administración?
UPD:
En administración única interfaz!
Buena idea para utilizar ModelForm.
django
django-admin
maxp
fuente
fuente
Respuestas:
Tendrá que crear un
forms.ModelForm
que describa cómo desea que se muestre eldescr
campo y luego decirleadmin.ModelAdmin
que use ese formulario. Por ejemplo:from django import forms class CabModelForm( forms.ModelForm ): descr = forms.CharField( widget=forms.Textarea ) class Meta: model = Cab class Cab_Admin( admin.ModelAdmin ): form = CabModelForm
El
form
atributo deadmin.ModelAdmin
está documentado en la documentación oficial de Django. Aquí hay un lugar para mirar .fuente
formfield_for_dbfield
suModelAdmin
, vea mi respuesta a continuación.django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited
fields = '__all__'
bajoclass Meta:
.get_form
método. Mira mi respuesta .Para este caso, la mejor opción probablemente sea usar un TextField en lugar de CharField en su modelo. También puede anular el
formfield_for_dbfield
método de suModelAdmin
clase:class CabAdmin(admin.ModelAdmin): def formfield_for_dbfield(self, db_field, **kwargs): formfield = super(CabAdmin, self).formfield_for_dbfield(db_field, **kwargs) if db_field.name == 'descr': formfield.widget = forms.Textarea(attrs=formfield.widget.attrs) return formfield
fuente
formfield.widget = forms.Textarea()
conformfield.widget = forms.Textarea(attrs=formfield.widget.attrs)
para mantener todos los atributos generados automáticamente para TextField, ¡Gracias!super()
. De otra manera no.Ayaz tiene bastante razón, excepto por un ligero cambio (?!):
class MessageAdminForm(forms.ModelForm): class Meta: model = Message widgets = { 'text': forms.Textarea(attrs={'cols': 80, 'rows': 20}), } class MessageAdmin(admin.ModelAdmin): form = MessageAdminForm admin.site.register(Message, MessageAdmin)
Por lo tanto, no necesita redefinir un campo en ModelForm para cambiar su widget, simplemente configure el dict de widgets en Meta.
fuente
Puede subclasificar su propio campo con el
formfield
método necesario :class CharFieldWithTextarea(models.CharField): def formfield(self, **kwargs): kwargs.update({"widget": forms.Textarea}) return super(CharFieldWithTextarea, self).formfield(**kwargs)
Esto afectará a todos los formularios generados.
fuente
No es necesario que cree la clase de formulario usted mismo:
from django.contrib import admin from django import forms class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): kwargs['widgets'] = {'descr': forms.Textarea} return super().get_form(request, obj, **kwargs) admin.site.register(MyModel, MyModelAdmin)
Consulte ModelAdmin.get_form .
fuente
Si está intentando cambiar el Textarea en admin.py, esta es la solución que funcionó para mí:
from django import forms from django.contrib import admin from django.db import models from django.forms import TextInput, Textarea from books.models import Book class BookForm(forms.ModelForm): description = forms.CharField( widget=forms.Textarea(attrs={'rows': 5, 'cols': 100})) class Meta: model = Book class BookAdmin(admin.ModelAdmin): form = BookForm admin.site.register(Book, BookAdmin)
Si está utilizando una base de datos MySQL, la longitud de su columna generalmente se configurará automáticamente a 250 caracteres, por lo que querrá ejecutar ALTER TABLE para cambiar la longitud en su base de datos MySQL, de modo que pueda aprovechar el nuevo área de texto más grande que tiene en su sitio Admin Django.
fuente
En lugar de a
models.CharField
, usamodels.TextField
paradescr
.fuente
Puede utilizar
models.TextField
para este propósito:class Sample(models.Model): field1 = models.CharField(max_length=128) field2 = models.TextField(max_length=1024*2) # Will be rendered as textarea
fuente
Quería ampliar la respuesta de Carl Meyer, que funciona perfectamente hasta la fecha.
Siempre uso en
TextField
lugar deCharField
(con o sin opciones) e impongo límites de caracteres en el lado de la interfaz de usuario / API en lugar de en el nivel de base de datos. Para hacer que esto funcione dinámicamente:from django import forms from django.contrib import admin class BaseAdmin(admin.ModelAdmin): """ Base admin capable of forcing widget conversion """ def formfield_for_dbfield(self, db_field, **kwargs): formfield = super(BaseAdmin, self).formfield_for_dbfield( db_field, **kwargs) display_as_charfield = getattr(self, 'display_as_charfield', []) display_as_choicefield = getattr(self, 'display_as_choicefield', []) if db_field.name in display_as_charfield: formfield.widget = forms.TextInput(attrs=formfield.widget.attrs) elif db_field.name in display_as_choicefield: formfield.widget = forms.Select(choices=formfield.choices, attrs=formfield.widget.attrs) return formfield
Tengo un nombre de modelo
Post
dondetitle
,slug
&state
areTextField
systate
tiene opciones. La definición de administrador se ve así:@admin.register(Post) class PostAdmin(BaseAdmin): list_display = ('pk', 'title', 'author', 'org', 'state', 'created',) search_fields = [ 'title', 'author__username', ] display_as_charfield = ['title', 'slug'] display_as_choicefield = ['state']
Pensé que otros que buscan respuestas podrían encontrar esto útil.
fuente
formfield_for_dbfield
documentado?