Django,按当前登录用户过滤以多对多模型形式呈现的集合

Bas*_*ian 2 django many-to-many

我知道它在某处,但我找不到它.

所以我有一个'类别'模型和一个'书'模型,它有多个到'类别'.在模型表格中创建新书时,会向用户显示所有类别以分配给书籍.在这种情况下,我只希望当前用户创建的类别显示在该字段中,而不是所有类别.

什么是最好的方法?

Aks*_*aaj 5

假设您的模型如下:

class Category(models.Model):
    ....
    creator = models.ForeignKey(User)

class Book(models.Model):
    ...
    categories = models.ManyToManyField(Category)
Run Code Online (Sandbox Code Playgroud)

假设您的表单如下:

class BookForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        current_user = kwargs.pop('user')
        super(BookForm, self).__init__(*args, **kwargs)
        self.fields['categories'].queryset = Categories.objects.filter(creator=current_user)
Run Code Online (Sandbox Code Playgroud)

因此,您需要覆盖__init__表单,将当前用户传递给此表单.然后queryset在所需的ManyToManyField上设置一个属性.

你的观点:

#GET request
book_form = BookForm(user=request.user)

#POST request
book_form = BookForm(data=request.POST, user=request.user)
Run Code Online (Sandbox Code Playgroud)