2010-12-02 112 views
17

我有這樣的一個布爾值模型:Django的:管理:改變字段的小部件管理

class TagCat(models.Model): 
    by_admin = models.BooleanField(default=True) 

這似乎在管理一個複選框。

  1. 我怎樣才能使用這個作爲管理單選按鈕?
  2. 此外,我怎麼把它變成總是與管理有一定選擇的價值?
  3. 另外,我希望當一個非管理員用戶添加TagCat的默認值是相反的。該字段應該隱藏起來。

有人能告訴我如何做到這一點? Django文檔似乎沒有詳細說明。

+0

你的第一個問題在http://stackoverflow.com/questions/854683/django-booleanfield-as-radio-buttons – 2010-12-02 17:02:09

+0

回答我已經讀過這個問題。答案似乎說如何取代它一般,而我希望這個具體情況只是無線電。最後的答案似乎是我想要的,我試了一下,並沒有工作,因爲在管理,則僅顯示標籤。我會貼上我的代碼爲「UPDATE 1」 – mgPePe 2010-12-02 17:15:07

回答

29

更新1:代碼,讓我與1完成)(不要忘了TOT的選擇傳遞給BooleanField模型)

from main.models import TagCat 
from django.contrib import admin 
from django import forms 

class MyTagCatAdminForm(forms.ModelForm): 
    class Meta: 
     model = TagCat 
     widgets = { 
      'by_admin':forms.RadioSelect 
     } 

class TagCatAdmin(admin.ModelAdmin): 
    form = MyTagCatAdminForm 


admin.site.register(TagCat, TagCatAdmin) 

單選按鈕出現醜陋和流離失所,但至少,他們工作

2)我解決了在MyModel.py以下信息:

BYADMIN_CHOICES = (
    (1, "Yes"), 
    (0, "No"), 
) 
class TagCat(models.Model): 
    by_admin = models.BooleanField(choices=BYADMIN_CHOICES,default=1) 
22

還有另一種方式來做到這一點,如果你想在同一類型的各個領域,以甲肝就是IMO容易得多e相同的小部件。這是通過爲ModelAdmin指定一個formfield_overrides來完成的。例如:

class MyModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.TextField: {'widget': RichTextEditorWidget}, 
    } 

更多的文檔:https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

9

這裏是mgPePe的迴應更動態擴展:

class MyAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyAdminForm, self).__init__(*args, **kwargs) 

     self.fields['by_admin'].label = 'My new label' 
     self.fields['by_admin'].widget = forms.RadioSelect() 


    class Meta: 
     model = TagCat 

class MyAdmin(admin.ModelAdmin): 
    fields = ['name', 'by_admin'] 
    form = MyAdminForm 

這樣你得到的田野完全控制。