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.ModelFormque describa cómo desea que se muestre eldescrcampo y luego decirleadmin.ModelAdminque 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 = CabModelFormEl
formatributo deadmin.ModelAdminestá documentado en la documentación oficial de Django. Aquí hay un lugar para mirar .fuente
formfield_for_dbfieldsuModelAdmin, vea mi respuesta a continuación.django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibitedfields = '__all__'bajoclass Meta:.get_formmé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_dbfieldmétodo de suModelAdminclase: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 formfieldfuente
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
formfieldmé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.TextFieldparadescr.fuente
Puede utilizar
models.TextFieldpara este propósito:class Sample(models.Model): field1 = models.CharField(max_length=128) field2 = models.TextField(max_length=1024*2) # Will be rendered as textareafuente
Quería ampliar la respuesta de Carl Meyer, que funciona perfectamente hasta la fecha.
Siempre uso en
TextFieldlugar 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 formfieldTengo un nombre de modelo
Postdondetitle,slug&stateareTextFieldsystatetiene 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_dbfielddocumentado?