Подтвердить что ты не робот

Администратор Django ManyToManyField

Я создал модель (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')

то я пытаюсь добавить встроенный блок, чтобы разрешить назначать opetest на странице "Изменить пользователя" (admin.py):

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

Я хочу показать opetests, например Groups, на странице смены пользователя. Как я могу это достичь?

4b9b3361

Ответ 1

Хмм, я не думаю, что вы хотите встроить строки.

Вы хотите использовать фильтр Django admin_horizontal:

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

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

Это даст вам виджет, который вы описываете, используемый для добавления/удаления групп на странице "Изменение пользователя".


Хорошо, на основе ваших изменений, обновленного ответа - в основном, у нас есть UserProfile, связанный с каждым пользователем.

Пользовательский профиль содержит отношение m2m к opetest - которое мы показываем в admin с фильтром_horizontal. Конечный результат выглядит примерно так:

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)

Сообщите мне, есть ли у вас какие-либо вопросы или что-то еще нужно.