saya sudah
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 )
bagaimana cara menetapkan widget TextArea ke bidang 'descr' di antarmuka admin?
upd: Hanya
dalam antarmuka Admin !
Ide bagus untuk menggunakan ModelForm.
django
django-admin
maks
sumber
sumber
Jawaban:
Anda harus membuat
forms.ModelForm
yang akan menjelaskan bagaimana Anda ingindescr
bidang tersebut ditampilkan, dan kemudian memberitahuadmin.ModelAdmin
untuk menggunakan formulir itu. Sebagai contoh: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
The
form
atributadmin.ModelAdmin
didokumentasikan dalam dokumentasi Django resmi. Inilah satu tempat untuk dilihat .sumber
formfield_for_dbfield
AndaModelAdmin
, lihat jawaban saya di bawah ini.django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited
fields = '__all__'
bawahclass Meta:
.get_form
metode. Lihat jawaban saya .Untuk kasus ini, opsi terbaik mungkin hanya menggunakan TextField daripada CharField di model Anda. Anda juga dapat mengganti
formfield_for_dbfield
metodeModelAdmin
kelas Anda :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
sumber
formfield.widget = forms.Textarea()
denganformfield.widget = forms.Textarea(attrs=formfield.widget.attrs)
untuk menjaga semua atribut secara otomatis dibuat untuk BidangTeks, Terima kasih!super()
. Jika tidak, tidak.Ayaz memiliki banyak posisi, kecuali untuk sedikit perubahan (?!):
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)
Jadi, Anda tidak perlu mendefinisikan ulang bidang di ModelForm untuk mengubah widgetnya, cukup setel dikt widget di Meta.
sumber
Anda dapat membuat subkelas bidang Anda sendiri dengan
formfield
metode yang diperlukan :class CharFieldWithTextarea(models.CharField): def formfield(self, **kwargs): kwargs.update({"widget": forms.Textarea}) return super(CharFieldWithTextarea, self).formfield(**kwargs)
Ini akan mempengaruhi semua formulir yang dihasilkan.
sumber
Anda tidak perlu membuat kelas formulir sendiri:
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)
Lihat ModelAdmin.get_form .
sumber
Daripada a
models.CharField
, gunakanmodels.TextField
untukdescr
.sumber
Jika Anda mencoba mengubah Textarea di admin.py, ini solusi yang berhasil untuk saya:
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)
Jika Anda menggunakan MySQL DB, panjang kolom Anda biasanya akan disetel otomatis menjadi 250 karakter, jadi Anda perlu menjalankan ALTER TABLE untuk mengubah panjang MySQL DB Anda, sehingga Anda dapat memanfaatkan Textarea baru yang lebih besar yang Anda gunakan. ada di situs Admin Django Anda.
sumber
Anda dapat menggunakan
models.TextField
untuk tujuan ini:class Sample(models.Model): field1 = models.CharField(max_length=128) field2 = models.TextField(max_length=1024*2) # Will be rendered as textarea
sumber
Ingin memperluas jawaban Carl Meyer, yang bekerja dengan sempurna hingga saat ini.
Saya selalu menggunakan
TextField
alih-alihCharField
(dengan atau tanpa pilihan) dan memaksakan batas karakter di sisi UI / API daripada di tingkat DB. Untuk membuat ini bekerja secara dinamis: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
Saya memiliki nama model
Post
wheretitle
,slug
&state
areTextField
s danstate
memiliki pilihan. Definisi admin terlihat seperti:@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']
Pikir orang lain yang mencari jawaban mungkin menganggap ini berguna.
sumber
formfield_for_dbfield
didokumentasikan?