Django Admin ManyToManyField

Django Admin ManyToManyField,django,django-models,django-admin,manytomanyfield,django-orm,Django,Django Models,Django Admin,Manytomanyfield,Django Orm,我制作了一个模型(models.py): 然后我尝试添加内联块,以允许在“更改用户”页面(admin.py)上分配opetest: 我犯了一个错误: 'ProfileAdmin.filter_horizontal' refers to field 'opetests' that is missing from model 'User'. 我想在“更改用户”页面上显示类似组的测试。我怎样才能做到呢?嗯,我想你不需要内联线 您希望使用Django管理员的筛选器\u: 这将提供您正在描述的小部件,

我制作了一个模型(models.py):

然后我尝试添加内联块,以允许在“更改用户”页面(admin.py)上分配
opetest

我犯了一个错误:

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

我想在“更改用户”页面上显示类似组的测试。我怎样才能做到呢?

嗯,我想你不需要内联线

您希望使用Django管理员的筛选器\u:

这将提供您正在描述的小部件,用于在用户更改页面上添加/删除组


好的,根据您的编辑,更新的答案-基本上,我们有一个用户配置文件,链接到每个用户

UserProfile包含一个与opetest的m2m关系,我们在admin中用一个过滤器显示了这个关系。最终结果如下:

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()
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)
admin.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()
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)

如果您有任何问题或需要进一步了解,请告诉我。

filter\u水平参数应参考模型字段。但是这里的opetest是一个模型。嗯,为什么不在UserProfile上创建
opetest
字段,并将其映射到
opetest
?这是一个m2m字段,所以它在关系的哪一端并不重要-那么你可以在
opetest
字段上使用
filter\u horizontal
?对不起,维克托,你能描述一下,我如何在UserProfile上创建字段并将其映射到opetest吗?所以,我添加了字段,但它不起作用:'class ProfileAdmin(UserAdmin):''usertests=models.ManyToManyField(opetest,blank=True)''ProfileAdmin.filter_horizontal'指的是模型'User'中缺少的字段'usertests'。'filter_horizontal=('usertests',)嗯,你能编辑你的问题,粘贴完整的
models.py
admin.py
吗?我对前面的文本有点困惑,因为您有
class ProfileADmin(UserAdmin)
,它看起来像
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)