Django Admin ManyToManyField

前端 未结 1 2079
别那么骄傲
别那么骄傲 2020-12-05 05:05

I\'ve made a model (models.py):

class opetest(models.Model):
    name = models.CharField(max_length=200)
    author = models.ForeignKey(User, related_name=\'         


        
相关标签:
1条回答
  • 2020-12-05 05:43

    Hmm, I don't think you want inlines here.

    You want to be using the Django admin's filter_horizontal:

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

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

    That will give you the widget that you're describing, used to add/remove Groups on the User Change page.


    Ok, based on your edits, updated answer - basically, what we have is a UserProfile, linked to each user.

    The UserProfile contains a m2m relationship to opetest - which we show in the admin with a filter_horizontal. End result is something like this:

    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)
    

    Let me know if you have any questions, or need anything further.

    0 讨论(0)
提交回复
热议问题