16

He hecho un modelo (models.py):Django administración 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') 

entonces trato de añadir bloque de línea para permitir asignar opetest el 'cambio de usuario' página (admin.py):

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

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

Y me dio un error:

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

quiero mostrar opetests como Grupos en cambie la página del usuario. ¿Cómo puedo lograr eso?

+0

Si la respuesta a continuación respondió su pregunta, ¿puede marcarla? Si no fue así, háganos saber qué más necesita, y podemos intentar ayudarlo. – victorhooi

Respuesta

38

Hmm, no creo que quiera líneas aquí.

Usted quiere ser el uso de filter_horizontal de la administración de Django:

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

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

que le dará el widget que usted está describiendo, se utiliza para añadir/eliminar los grupos en la página Cambiar usuario.


Ok, sobre la base de sus ediciones, actualizado respuesta - básicamente, lo que tenemos es un PerfilUsuario, vinculado a cada usuario.

El perfil de usuario contiene una relación m2m con el operador, que mostramos en el administrador con un filtro_horizontal. El resultado final es algo como esto:

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) 

, hágamelo saber si usted tiene alguna pregunta, o necesita nada más.

+0

Los parámetros de filter_horizontal deben hacer referencia a los campos del modelo. Pero el más operativo aquí es un modelo. – baobee

+0

Hmm, ¿por qué no creas el campo 'opetest' en UserProfile, y tienes ese mapa en' opetest'? Es un campo m2m, por lo que no debería importar en qué extremo de la relación está, entonces puedes usar 'filter_horizontal' en el campo' opetest'. – victorhooi

+0

Lo siento Victor, ¿puedes describir cómo puedo crear un campo en UserProfile y asignarlo al opetest? – baobee

Cuestiones relacionadas