2009-09-18 4 views
2

J'ai une relation de ManyToMany:Dans Django Admin, je veux changer la façon dont les clés étrangères sont affichées dans un grand nombre Many widget admin Relation

 
class Book: 
    title = models.CharField(...) 
    isbn = models.CharField(...) 

    def unicode(self): 
    return self.title 

    def ISBN(self): 
    return self.isbn 

class Author: 
    name = models.CharField(...) 
    books = models.ManyToManyField(Book...) 

Dans l'interface admin Auteur Je reçois un multiple liste de sélection qui utilise l'affichage Unicode pour les livres. Je veux changer la liste de deux façons:

1) Seulement pour l'interface d'administration Je veux afficher le numéro ISBN, partout ailleurs j'imprime juste un objet "Livre" Je veux que le titre soit affiché.

2) Comment pourrais-je utiliser un meilleur widget que MultipleSelectList pour ManyToMany. Comment pourrais-je spécifier d'utiliser un CheckBoxSelectList à la place?

Répondre

1

Pour 2), utilisez dans votre classe AuthorAdmin:

raw_id_fields = ['books'] 

Vérifiez ici: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin pour obtenir des instructions sur la création d'une classe ModelAdmin personnalisée. J'y ai beaucoup réfléchi moi-même pour mon propre projet Django, et je pense que 1) il faudrait modifier le modèle d'administration pour voir les objets Author.

2

Pour afficher le numéro ISBN, vous pouvez faire un champ personnalisé comme celui-ci:


class BooksField(forms.ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return obj.isbn 

Il y a un CheckboxSelectMultiple pour le ManyToManyField mais il n'affiche pas correctement sur l'administrateur, vous pouvez donc aussi écrire du code CSS pour corriger cette.

Vous devez créer un formulaire pour le modèle, et l'utiliser dans votre classe admin:


class AuthorForm(forms.ModelForm): 
    books = BooksField(Book.objects.all(), widget=forms.CheckboxSelectMultiple) 

    class Meta: 
     model = Author 

    class Media: 
     css = { 
      'all': ('booksfield.css',) 
     } 

class AuthorAdmin(admin.ModelAdmin): 
    form = AuthorForm 
Questions connexes