0

I have been trying for awhile now without any luck.. I have model Like this:

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']

Every user can create their own lists and add values to those lists. I have adding values and everything else working but to the form that adds these values I would somehow need to filter to show only users own lists, now its showing all lists created by every user... this is the form:

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

Any ideas how to filter it? I have tempoary "list.objects.all()" since dont want it to give error that crashes the server. I have watched a ton of examples on stackoverflow but none of them seems to be exact thing that I am looking for.. Thanks already for asnwers! :)

2 Answers2

0

You need to get hold of the current user, e.g. like so or so.

That is, you pass request.user to the form when instantiating it in your view:

frm = DataForm(user=request.user)

In the __init__ of your form class, you can then assign the user-filtered queryset to your field:

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)
Endre Both
  • 5,540
  • 1
  • 26
  • 31
0

You can set your form to take the user when initialized, and from there get a new queryset filtered by user.

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)

You would inititialize the form like this:

form = DataForm(request.user)
p14z
  • 1,760
  • 1
  • 11
  • 17