django - Django Admin ManyToManyField

标签 django django-models django-admin manytomanyfield django-orm

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

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')

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

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

我得到一个错误:
'ProfileAdmin.filter_horizontal' refers to field 'opetests' that is missing from model 'User'.

我想在更改用户页面上显示“网上论坛”之类的抗议 Activity 。我该如何实现?

最佳答案

嗯,我认为您不需要在此插入行。

您要使用Django管理员的filter_horizo​​ntal:

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

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

这将为您提供您所描述的小部件,该小部件用于在“用户更改”页面上添加/删除组。

好的,根据您的修改和更新的答案-基本上,我们拥有的是一个UserProfile,已链接到每个用户。

UserProfile包含与opetest的m2m关系-我们在后台使用filter_horizo​​ntal显示该关系。最终结果是这样的:
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)

让我知道您是否有任何疑问,或需要进一步的帮助。

关于django - Django Admin ManyToManyField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8043881/

相关文章:

python - Django 管理员。在更改选择字段时隐藏字段

django - MacVim 中的错误命令输出

Django - 扩展 LogEntry

html - xhtml2pdf 在创建 pdf 时不应用 css(html 到 pdf)

django - 向现有的 django Mongoengine 模型添加了新的 bool 字段,但之后无法过滤该字段

python - 显示不带秒的 TimeField 值 - Django

django - 在 Django 1.5 自定义用户模型中使用电子邮件作为用户名字段会导致 FieldError

设置 user_permissions 时,Django 用户 get_all_permissions() 为空

django - 在 Django 中为多个 SQS 消费者启用锁定机制的常见做法是什么,这样我就可以实现幂等

python django 日志记录 : One single logger with more than one logging level