Django-Admin: CharField comme TextArea

j’ai

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 ) 

comment assigner le widget TextArea au champ ‘descr’ dans l’interface d’administration?

mise à jour:
Dans l’interface administrateur uniquement!

Bonne idée d’utiliser ModelForm.

Vous devrez créer un forms.ModelForm qui décrira comment vous souhaitez afficher le champ de admin.ModelAdmin , puis admin.ModelAdmin à admin.ModelAdmin d’utiliser ce formulaire. Par exemple:

 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 

L’atsortingbut de admin.ModelAdmin de admin.ModelAdmin est documenté dans la documentation officielle de Django. Voici un endroit à regarder .

Dans ce cas, la meilleure option est probablement d’utiliser un TextField au lieu de CharField dans votre modèle. Vous pouvez également remplacer la méthode ModelAdmin de votre classe 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 

Ayaz a pratiquement fait son chemin, sauf pour un léger changement (?!):

 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) 

Donc, vous n’avez pas besoin de redéfinir un champ dans ModelForm pour changer son widget, il suffit de définir le dict des widgets dans Meta.

Vous pouvez sous-classer votre propre champ avec la méthode formfield requirejse:

 class CharFieldWithTextarea(models.CharField): def formfield(self, **kwargs): kwargs.update( "widget": forms.Textarea ) return super(CharFieldWithTextarea, self).formfield(**kwargs) 

Cela prendra effet sur tous les formulaires générés.

Si vous essayez de changer le Textarea sur admin.py, c’est la solution qui a fonctionné pour moi:

 from django import forms from django.consortingb 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 vous utilisez une firebase database MySQL, la longueur de votre colonne sera généralement définie sur 250 caractères, vous devrez donc exécuter une table ALTER TABLE pour modifier la longueur de votre firebase database MySQL, afin de tirer parti de la nouvelle zone de texte avoir dans votre site Admin Django.

Au lieu d’un models.CharField , utilisez un models.TextField pour descr .

Je voulais approfondir la réponse de Carl Meyer, qui fonctionne parfaitement jusqu’à cette date.

J’utilise toujours TextField au lieu de CharField (avec ou sans choix) et impose des limites de caractères côté interface utilisateur / API plutôt qu’au niveau de la firebase database. Pour que cela fonctionne dynamicment:

 from django import forms from django.consortingb 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 

J’ai un nom de modèle Posttitle , slug & state sont TextField s et state a des choix. La définition de l’administrateur ressemble à:

 @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 les autres à la recherche de réponses pourraient trouver cela utile.

Vous pouvez utiliser models.TextField à cette fin:

 class Sample(models.Model): field1 = models.CharField(max_length=128) field2 = models.TextField(max_length=1024*2) # Will be rendered as textarea 

Vous n’avez pas besoin de créer la classe de formulaire vous-même:

 from django.consortingb 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) 

Voir ModelAdmin.get_form