使用 Admin.User 模型从内联获取数据

Get Data from Inline with Admin.User Model

我正在尝试将 'augmentation' table 与 Admin.User 模型一起使用,以存储与 user/login 相关的其他数据。

这是我的admin.py

class UserProfileInline(admin.StackedInline):
    model = AppUserProfile
    can_delete = False
    verbose_name_plural = 'profile'


# Define a new User admin
class UserAdmin(BaseUserAdmin):
    inlines = (UserProfileInline,)


# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

这是我的 models.py

class AppUserProfile(models.Model):
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    usr_tpid = models.CharField(max_length=20)
    usr_cstid = models.CharField(max_length=20)
    db_table = 'app_user_profile'

这是我的 views.py,我试图从登录值中获取 usr_cstid。

def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            print(request.POST)
            username = form.cleaned_data['userName']
            password = form.cleaned_data['password']
            userInfo = AppUserProfile.objects.all().filter(user=username)
            print(username)
            print(userInfo)
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                groups = [x.name for x in user.groups.all()]
                full_info = User.objects.all().filter(username=username)
                user_info = User.objects.all().filter(username=username).values('first_name')
                print(full_info)
                request.session['first_name'] = user_info[0]['first_name']
                request.session['user_group'] = groups[0]
                # print(user_info, groups)
                # return render(request, template_name='landingPage.html', context={'user': first_name})
                if 'Administrator' in groups:
                    # return render(request, template_name='adm_landing_page.html', context={'user': first_name})
                    return redirect('AdminPortal:adm_landing_page')
                if 'Supplier' in groups:
                    # return HttpResponseRedirect(reverse('adm_landing_page', args=(), kwargs={'user': username}))
                    return render(request, template_name='supplier_landing_page.html', )
                    # return redirect('SupplierPortal:supplier_landing_page')

            else:
                form = LoginForm()
    else:
        form = LoginForm()

    return render(request, 'registration/login.html', {'form': form})

但是我收到以下错误:

ValueError: invalid literal for int() with base 10: 'supplier_ad'

似乎这是导致错误的行:

    userInfo = AppUserProfile.objects.all().filter(user=username)

我不确定我哪里错了,或者如何 link 回到那些值。

不确定你想用这个实现什么,但你不能通过 username string 而不是 user object 或用户来过滤 user object id 或者你可以这样做

userInfo = AppUserProfile.objects.all().filter(user__username=username)

如果您需要一个 AppUserProfile 实例,请使用 get() 而不是 filter()

我也没有看到你到底想达到什么目的,因为当你登录你的用户时,它总是可以通过 request.user 访问,并且根据关系你可以获得结果配置文件,例如假设 OneToOne关系 request.user.profile