16

Tôi đã thực hiện một mô hình (models.py):Django quả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') 

sau đó tôi cố gắng thêm khối inline để cho phép gán opetest trên trang 'người sử dụng thay đổi' (admin.py):

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

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

Và tôi đã nhận ra lỗi:

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

tôi muốn hiển thị opetests như Groups trên thay đổi người dùng trang. Làm thế nào tôi có thể đạt được điều đó?

+0

Nếu câu trả lời bên dưới trả lời câu hỏi của bạn, bạn có thể đánh dấu vào nó không? Nếu không, vui lòng cho chúng tôi biết bạn cần gì khác và chúng tôi có thể thử và trợ giúp. – victorhooi

Trả lời

38

Hmm, tôi không nghĩ bạn muốn inline ở đây.

Bạn muốn được sử dụng filter_horizontal các admin Django:

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

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

Điều đó sẽ cung cấp cho bạn những widget mà bạn đang mô tả, được sử dụng để thêm/xóa nhóm trên trang tài khoản Thay đổi.


Ok, dựa trên chỉnh sửa của bạn, câu trả lời được cập nhật - về cơ bản, những gì chúng tôi có là UserProfile, được liên kết với từng người dùng.

UserProfile có mối quan hệ m2m với opetest - mà chúng tôi hiển thị trong quản trị có bộ lọc_horizontal. Kết quả cuối cùng là một cái gì đó như thế này:

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ãy cho tôi biết nếu bạn có bất cứ thắc mắc hoặc cần bất cứ điều gì thêm.

+0

tham số filter_horizontal nên tham chiếu đến các trường mô hình. Nhưng opetest ở đây là một mô hình. – baobee

+0

Hmm, tại sao bạn không tạo trường 'opetest' trên UserProfile và có bản đồ đó thành' opetest'? Đó là một lĩnh vực m2m, do đó, nó không nên thực sự quan trọng mà kết thúc của mối quan hệ nó trên - sau đó bạn chỉ có thể sử dụng 'filter_horizontal' trên lĩnh vực' opetest'? – victorhooi

+0

Xin lỗi Victor, bạn có thể mô tả, làm thế nào tôi có thể tạo trường trên UserProfile và ánh xạ nó trên trang web không? – baobee

Các vấn đề liên quan