widgets hiddeninput django django-admin

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 .