2010-12-02 5 views
17

Ich habe ein Modell mit einem Booleschen Wert wie folgt aus:Django: Admin: das Widget des Feldes in Admin Ändern

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

Dies erscheint als eine Checkbox in Admin.

  1. Wie könnte ich das als Radioknopf in Admin verwenden?
  2. Auch, wie mache ich es immer mit einem bestimmten Wert in admin?
  3. Ich möchte auch den Standardwert das Gegenteil sein, wenn ein Nicht-Admin-Benutzer eine TagCat hinzufügt. Dieses Feld sollte vor ihm verborgen sein.

Kann mir jemand sagen, wie man das macht? Django-Dokumentation scheint nicht in solchen Details zu gehen.

+0

Ihre erste Frage wird in http://stackoverflow.com/questions/854683/django-booleanfield-as-radio-buttons beantwortet –

+0

Ich habe diese Frage gelesen. Die Antworten scheinen zu sagen, wie man sie im Allgemeinen ersetzen kann, während ich möchte, dass dieser spezielle Fall nur Radio ist. Die letzte Antwort scheint zu sein, was ich will, und ich habe es versucht und nicht funktioniert, weil im Admin nur das Etikett erscheint. Ich werde meinen Code als 'UPDATE 1' einfügen – mgPePe

Antwort

29

UPDATE 1: Code, die mich mit 1) (vergessen Sie nicht tot passieren WAHLEN an die BooleanField im Modell)

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) 

Die Radio-Buttons erscheinen hässlich und verschoben, aber zumindest getan wird, sie arbeiten

2) I gelöst mit folgenden Informationen in MyModel.py:

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

Das hat mir sehr geholfen! Vielen Dank! : D – lucasmonteiro001

22

Es gibt einen anderen Weg, dies zu tun, ist, die, IMO ist viel einfacher, wenn Sie jedes Feld des gleichen Typs wollen hav e das gleiche Widget. Dies geschieht, indem formfield_overrides für ModelAdmin angegeben wird. Zum Beispiel:

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

Mehr in der Dokumentation: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

9

Hier ist eine dynamische Erweiterung von mgPePe Antwort:

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 

diese Weise können Sie die volle Kontrolle über die Felder zu bekommen.