从用户列表对象创建动态ModelChoiseField

时间:2019-03-13 15:19:23

标签: django

我已经尝试了好一阵子了,没有任何运气。我有这样的模型:

class List(models.Model):
    name = models.CharField(max_length=100, default="")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')
    def __str__(self):
        returnself.name

    class Meta:
        unique_together = ['name', 'user']

每个用户都可以创建自己的列表并将值添加到这些列表中。我已经添加了值,并且所有其他工作都正常了,但是添加到这些值的表单中,我将需要进行过滤以仅显示用户自己的列表,现在它显示了每个用户创建的所有列表...这是表单:

class data_form(forms.Form):
    user_lists = List.objects.all()
    selection = forms.ModelChoiceField(queryset=user_lists)
    data = forms.IntegerField()

任何想法如何过滤?我有临时的“ list.objects.all()”,因为不希望它给崩溃服务器的错误提供帮助。我已经看了很多关于stackoverflow的示例,但是它们似乎都不是我要找的东西。。 :)

2 个答案:

答案 0 :(得分:0)

您需要掌握当前用户,例如like so or so

也就是说,您在视图中实例化表单时将request.user传递给表单:

frm = DataForm(user=request.user)

然后在表单类的__init__中,可以将用户过滤的查询集分配给您的字段:

class DataForm(forms.Form):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop("user")
        super(DataForm, self).__init__(*args, **kwargs)
        self.fields['selection'].queryset = List.objects.filter(user=user)

答案 1 :(得分:0)

您可以将表单设置为在初始化时使用用户,然后从那里获得按用户过滤的新查询集。

class DataForm(forms.Form):
    selection = forms.ModelChoiceField(queryset=List.objects.none())
    data = forms.IntegerField()

    def __init__(self, user, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['selection'].queryset = List.objects.filter(user=user)

您将像这样初始化表格:

form = DataForm(request.user)