2010-08-12 30 views
22

Özel bir Etiket Biçimi form alanına sahibim.Django Yöneticisi - Özel form alanının pencere aracını geçersiz kılma

class TagField(forms.CharField): 
    def __init__(self, *args, **kwargs): 
     super(TagField, self).__init__(*args, **kwargs) 
     self.widget = forms.TextInput(attrs={'class':'tag_field'}) 

Yukarıda görüldüğü gibi, bir TextInput form alanı widget'ını kullanır. Ama yönetici olarak Textarea widget'ı kullanılarak görüntülenmesini istiyorum. Bunun için formfield_overrides kanca var ama bu durum için çalışmaz.

yönetici beyanıdır:

class ProductAdmin(admin.ModelAdmin): 
    ... 
    formfield_overrides = { 
     TagField: {'widget': admin.widgets.AdminTextareaWidget}, 
    } 

Bu form alanı widget'ı üzerinde hiçbir etkisi yoktur ve tags hala TextInput widget'la oluşturulur.

Herhangi bir yardım çok takdir edilmektedir.

-
OMAT

cevap

40

django admin, birçok alanı için özel widget'lar kullanır. Alanları geçersiz kılmanın yolu, ModelAdmin nesnesiyle kullanılmak üzere bir Form oluşturmaktır. Ayrıca şu anda Sorgu Kümesi geçersiz kılabilir

from django.contrib import admin 
from models import Product 
from forms import ProductAdminForm 

class ProductAdmin(admin.ModelAdmin): 
    form = ProductAdminForm 

admin.site.register(Product, ProductAdmin) 

:

# forms.py 

from django import forms 
from django.contrib import admin 

class ProductAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ProductAdminForm, self).__init__(*args, **kwargs) 
     self.fields['tags'].widget = admin.widgets.AdminTextareaWidget() 

Ardından, ModelAdmin nesnesinde, formu belirtmek örneğin modeldeki başka bir alana göre nesneleri filtrelemek için (limit_choices_to Sen Django 1.2 beri uzanan ModelForm Meta sınıfı tarafından saha widget geçersiz kılabilir

+0

Bu benim için çalışmadı, sınıftan ziyade bir widget örneğini geçirmeniz gerekiyor. Örnek, yine de mükemmel çalıştı. –

+0

Genellikle admin.py'de özel yönetim formları oluşturabilir ve bunları forms.py ile karıştırmam. Bu, diğer geliştiriciler için herhangi bir karışımı azaltır ve aynı .py dosyasında tüm yönetici belirli öğeleri tutar. – MaestroFJP

+0

İyi nokta @MaestroFJP. Sadece yeni kodumda bunu yapıyorum. Veya, gerçekten karmaşık formlarınız varsa ve bunların birçoğu varsa,/admin.py formlarının bir alt modülüne sahip olun. –

1

deneyin bu gibi alanını değiştirmek için:

class TagField(forms.CharField): 
    def __init__(self, *args, **kwargs): 
     self.widget = forms.TextInput(attrs={'class':'tag_field'}) 
     super(TagField, self).__init__(*args, **kwargs) 

Bu **kwargs gelen widget'ı kullanmak için izin verecek. Aksi halde, alanınız her zaman form.TextInput widget'ını kullanır.

+0

Değişikliği uyguladı ancak şimdi tüm etiket alanları Textarea olarak işleniyor. sınıf TagField (form.CharField): – omat

+0

django.forms.fields baktığımızda bir alan için varsayılan widget'ı belirtmek için doğru yol olduğunu tespit Widget = forms.TextInput def widget_attrs (öz, widget): {'class': 'tag_field'} döndürün '__init__' yöntemini geçersiz kıldınız. Bunu dene. –

+0

teşekkürler ama hala hayır şans. Tüm etiket alanları, yalnızca ProductAdmin için değil, tüm yönetici üzerinde Textarea olarak görüntülenir. – omat