2010-12-02 62 views
17

J'ai un modèle avec une valeur booléenne comme ça:Django: Admin: changer le widget du champ dans Admin

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

Ceci apparaît comme une case à cocher dans l'admin.

  1. Comment est-ce que je pourrais employer ceci comme bouton radio dans l'admin?
  2. En outre, comment puis-je faire être toujours avec une certaine valeur sélectionnée dans l'admin?
  3. , je veux aussi la valeur par défaut à l'inverse, lorsqu'un utilisateur non administrateur ajoute un TagCat. Ce champ devrait lui être caché.

Quelqu'un peut-il me dire comment faire? La documentation de Django ne semble pas aller dans de tels détails.

+0

Vous avez répondu à votre première question sur http://stackoverflow.com/questions/854683/django-booleanfield-as-radio-buttons –

+0

J'ai lu cette question. Les réponses semblent indiquer comment le remplacer en général, alors que je veux que ce cas spécifique soit seulement radio. La dernière réponse semble être ce que je veux, et j'ai essayé et cela n'a pas fonctionné, parce que dans l'admin, seul l'étiquette apparaît. Je vais coller mon code comme « MISE À JOUR 1 » – mgPePe

Répondre

29

MISE À JOUR 1: Code qui me soit fait avec 1) (ne pas oublier tot passer CHOICES au BooleanField dans le modèle)

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) 

Les boutons radio apparaissent laids et déplacés, mais au moins, ils travailler

2) Je résolus avec les informations suivantes dans MyModel.py:

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

Cela m'a beaucoup aidé! Merci! :RÉ – lucasmonteiro001

22

Il y a une autre façon de faire qui est, l'OMI beaucoup plus facile si vous voulez tous les domaines du même type VHA e le même widget. Ceci est fait en spécifiant un formfield_overrides à ModelAdmin. Par exemple:

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

Plus dans les docs: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

9

Voici une extension plus dynamique de la réponse 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 

De cette façon, vous obtenez un contrôle total sur les champs.