如何在 django ModelForm 中设置基于用户的表单字段选择(使用 django-allauth)

How to set User-based form field choices in a django ModelForm (with django-allauth)

我正在使用 Django 1.8 和 django-allauth。我有一个带有下拉菜单的简单表单,允许我的用户选择角色模型。 我有一个如下所示的 UserCharacter 模型:

    class UserCharacter(models.Model):
        user = models.ForeignKey(User)
        character = models.ForeignKey(Character)
        is_default = models.BooleanField(default=False)

在我的主窗体中,我只显示 "character" 字段,它显示为字符对象的下拉菜单。到目前为止一切顺利 - 用户可以 select 一个角色并将其保存为 UserCharacter 关联。

我想做的是显示所有尚未将 UserCharacter 链接到当前登录用户的 Character 对象。我通常会使用 limit_choices_to 功能,像这样:

    character = models.ForeignKey(Character, limit_choices_to={'id__in': UserCharacter.objects.filter(user_id=[USER_ID]))

我的问题是,我不知道如何从 UserCharacter 模型或 ModelForm 访问当前用户对象。我通常需要访问当前请求以获取 django-allauth 登录用户对象。通常代替 [USER_ID] 的是

    self.request.user.id 

从 django-allauth 获取当前用户的 id,但我不能从这里的模型中获取。我将如何根据当前用户对象更改 ModelForm 中的表单选项? 非常感谢!

因为这需要当前登录的用户,所以您必须在 View 中根据您的用户覆盖表单字符 QuerySet

form.character.queryset = Character.objects.filter(....)

您也可以将 request.user 传递给表单,并在构造函数中在那里进行筛选。