William
William

Reputation: 115

How do I filter values in Django CreateView, UpdateView

I am trying to use CreateView and UpdateView to modify records. My problem is that the ForeignKey dropdown lists values (Psa.number) for all companies instead only those of the company to which the user belongs.

class Psa(models.Model):
    owner = models.ForeignKey(Employer)
    number = models.PositiveIntegerField(unique=True...
    type = models.CharField(max_length=6 ...

class Employer(models.Model):
employer_name = models.CharField(max_length=100, unique=True)

The form:

class PsaCreateForm(forms.ModelForm):
class Meta:
    model = Psa
    fields = [
        'number',
        'type',
    ]

What is the best way to solve this? I've got several other conditions that use the same company foreignkey relationship so is there a way to create a method on the model that I can reuse?

Upvotes: 0

Views: 1588

Answers (1)

Sascha Rau
Sascha Rau

Reputation: 357

You need get_form_kwargs(self) in CreateView and UpdateView:

forms.py:

class PsaCreateForm(forms.ModelForm):

    model = Psa
    fields = [
        'number',
        'type',
    ]

    def __init__(self, *args, **kwargs):
        self.current_user = kwargs.pop('user')
        super(PsaCreateForm, self).__init__(*args, **kwargs)
        if self.current_user:
            self.fields['number'].queryset = Psa.objects.filter(owner=self.current_user)

views.py

class PsaCreate(CreateView):
    model = Psa
    template_name = 'form.html'
    form_class = PsaCreateFrom

    def get_form_kwargs(self):
        kwargs = super(PsaCreate, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

Also a good idea. Set def dispatch(self, request, *args, **kwargs): in your Views.

def dispatch(self, request, *args, **kwargs):
    obj = self.get_object()
    if obj.owner != self.request.user:
        return HttpResponseRedirect(reverse('home'))
    return super(PsaUpdate, self).dispatch(request, *args, **kwargs)

Upvotes: 1

Related Questions