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

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

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


person baobee    schedule 07.11.2011    source источник
comment
Если ответ ниже ответил на ваш вопрос, не могли бы вы отметить его? Если этого не произошло, сообщите нам, что еще вам нужно, и мы постараемся помочь.   -  person victorhooi    schedule 15.11.2011


Ответы (1)


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

Вы хотите использовать filter_horizontal администратора Django:

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

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

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


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

UserProfile содержит отношение m2m к opetest, которое мы показываем в админке с помощью filter_horizontal. Конечный результат примерно такой:

Opetest с горизонтальным фильтром

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)

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

person victorhooi    schedule 07.11.2011
comment
Параметры filter_horizontal должны ссылаться на поля модели. Но опетесть вот это модель. - person baobee; 08.11.2011
comment
Хм, почему бы вам не создать поле opetest в UserProfile и не сопоставить его с opetest? Это поле m2m, поэтому на самом деле не должно иметь значения, на каком конце отношения оно находится - тогда вы можете просто использовать filter_horizontal в поле opetest? - person victorhooi; 08.11.2011
comment
Извините, Виктор, не могли бы вы описать, как я могу создать поле в UserProfile и сопоставить его с opetest? - person baobee; 08.11.2011
comment
Итак, я добавил поле, но оно не работает: «класс ProfileAdmin (UserAdmin):» «usertests = models.ManyToManyField (opetest, пусто = True)» «ProfileAdmin.filter_horizontal» относится к отсутствующему полю «usertests». из модели «Пользователь». filter_horizontal = ('пользовательские тесты',) - person baobee; 08.11.2011
comment
Хм, не могли бы вы отредактировать свой вопрос и вставить полные models.py и admin.py, пожалуйста? Я немного запутался в предыдущем тексте, так как у вас есть class ProfileADmin(UserAdmin), который выглядит как admin.py, но затем в следующей строке вы определяете поле модели. Если вы вставите свой полный код, мы поможем вам упростить его работу. - person victorhooi; 08.11.2011
comment
это был эксперимент, потому что я не знаю, как добавить поле на лету в ProfileADmin. Вы можете помочь мне? Итак, у меня есть «стартовые» модели, и я откатил изменения. - person baobee; 08.11.2011
comment
@baobee: Что ты имеешь в виду под "на лету"? Вы имеете в виду динамически во время выполнения? запутался. Если вы вставите свой исходный код и то, чего вы пытаетесь достичь, мы можем помочь вам больше =). - person victorhooi; 08.11.2011
comment
Можно ли его использовать вне администратора django? Я хотел использовать его в промежуточном представлении, которое я создал, которое технически не является официальным представлением администратора, я просто добавляю URL-адрес в get_urls. - person radtek; 18.02.2015