widgets - hiddeninput django
Django-Admin: CharField como TextArea (9)
Ayaz tiene bastante lugar, 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 el ModelForm para cambiar su widget, simplemente configure el wictts dict en Meta.
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:
¡Solo en la interfaz de administrador !
Buena idea para usar ModelForm.
En lugar de un models.CharField
, utiliza un descr
para descr
.
No necesita crear 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)
Ver ModelAdmin.get_form .
Para este caso, la mejor opción es, probablemente, solo utilizar un TextField en lugar de CharField en su modelo. También puede anular el método formfield_for_dbfield
de su clase ModelAdmin
:
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
Puede subclasificar su propio campo con el método de campo de formfield
necesario:
class CharFieldWithTextarea(models.CharField):
def formfield(self, **kwargs):
kwargs.update(
"widget": forms.Textarea
)
return super(CharFieldWithTextarea, self).formfield(**kwargs)
Esto tendrá efecto en todas las formas generadas.
Puede usar 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
Quería ampliar la respuesta de Carl Meyer, que funciona perfectamente hasta esta fecha.
Siempre utilizo TextField
lugar de CharField
(con o sin opciones) e CharField
límites de caracteres en el lado de UI / API en lugar de a nivel de base de datos. Para 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
donde title
, slug
y state
son TextField
y el state
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 buscaban respuestas podrían encontrarlo útil.
Si está intentando cambiar 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 normalmente se configurará automáticamente en 250 caracteres, por lo que querrá ejecutar una ALTER TABLE para cambiar la longitud en su base de datos MySQL, para que pueda aprovechar el nuevo Textarea más grande que usted tener en usted el sitio Admin Django.
Tendrá que crear un forms.ModelForm
que describirá cómo desea que se muestre el campo descr
, y luego le admin.ModelAdmin
a admin.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 atributo de form
de admin.ModelAdmin
está documentado en la documentación oficial de Django. Aquí hay un lugar para mirar .