16

J'ai fait un modèle (models.py):Django Administrateur ManyToManyField

class opetest(models.Model): 
    name = models.CharField(max_length=200) 
    author = models.ForeignKey(User, related_name='author') 
    description = models.TextField(u'Test description', help_text = u'Some words about quiz') 
    pub_date = models.DateTimeField('date published', blank=False) 
    vacancies = models.ManyToManyField(Vacancy, blank=True) 
    students = models.ManyToManyField(User, blank=True, related_name='opetests') #This field I want to edit on "User change page" 
    estimate = models.IntegerField(default = 0, help_text = u'Estimate time in hours. \'0\' - unlimited') 

alors j'essaie d'ajouter un bloc de ligne pour permettre attribuer opetest à la page 'utilisateur changement' (admin.py):

class ProfileAdmin(UserAdmin): 
    filter_horizontal = ('opetests',) 

admin.site.unregister(User) 
admin.site.register(User, ProfileAdmin) 

Et je suis une erreur:

'ProfileAdmin.filter_horizontal' refers to field 'opetests' that is missing from model 'User'. 

Je veux montrer opetests comme Groupes sur Changer l'utilisateur page. Comment puis-je y parvenir?

+0

Si la réponse ci-dessous a répondu à votre question, pouvez-vous la cocher? Si ce n'est pas le cas, s'il vous plaît laissez-nous savoir ce que vous avez besoin, et nous pouvons essayer et aider. – victorhooi

Répondre

38

Hmm, je ne pense pas que vous vouliez des inlines ici.

Vous voulez être en utilisant le filter_horizontal admin Django:

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizontal

class ProfileAdmin(UserAdmin) 
    filter_horizontal = ('opetest',) 

Cela vous donnera le widget que vous décrivez, utilisé pour ajouter/supprimer des groupes sur la page Modifier l'utilisateur.


Ok, en fonction de vos modifications, mises à jour réponse - en gros, ce que nous avons est un UserProfile, lié à chaque utilisateur. Le UserProfile contient une relation m2m avec opetest - que nous montrons dans l'admin avec un filter_horizontal. Le résultat final est quelque chose comme ceci:

Opetest with Filter horizontal

models.py

from django.db import models 
from django.contrib.auth.models import User 

class opetest(models.Model): 
    name = models.CharField(max_length=200) 
    author = models.ForeignKey(User, related_name='author') 
    description = models.TextField(u'Test description', help_text = u'Some words about quiz') 
    pub_date = models.DateTimeField('date published', blank=False) 
    #vacancies = models.ManyToManyField(Vacancy, blank=True) 
    students = models.ManyToManyField(User, blank=True, related_name='opetests') #This field I want to edit on "User change page" 
    estimate = models.IntegerField(default = 0, help_text = u'Estimate time in hours. \'0\' - unlimited') 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    ope = models.ManyToManyField(opetest) 
    test_flag = models.BooleanField() 

admin.py

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.models import User 
from secondapp.models import UserProfile, opetest 

admin.site.unregister(User) 

class opetestAdmin(admin.ModelAdmin): 
    pass 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    filter_horizontal = ('ope',) 

class CustomUserAdmin(UserAdmin): 
    #filter_horizontal = ('user_permissions', 'groups', 'ope') 
    save_on_top = True 
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'last_login') 
    inlines = [UserProfileInline] 

admin.site.register(User, CustomUserAdmin) 
admin.site.register(opetest, opetestAdmin) 

Laissez-moi savoir si vous avez des questions, ou besoin d'autre chose.

+0

Les paramètres filter_horizontal doivent se référer aux champs du modèle. Mais l'opétest ici est un modèle. – baobee

+0

Hmm, pourquoi ne pas créer le champ 'opetest' sur UserProfile, et avoir cette carte à' opetest'? C'est un champ m2m, donc ça ne devrait pas vraiment importer quelle extrémité de la relation c'est - alors vous pouvez juste utiliser 'filter_horizontal' sur le champ' opetest'? – victorhooi

+0

Désolé Victor, pouvez-vous s'il vous plaît décrire, comment puis-je créer un champ sur UserProfile et le mapper à opetest? – baobee