How to list only active users in dropdown menu

Viewed 232

I want to list all active users in dropdown list. But all users are listed in the dropdown How can I do it?

template

<form method="post">
   {% csrf_token %}
   {{ form|crispy }}
   <input type="hidden" name="customer_id" value="{{ customer.id }}">
   <button type="submit" class="btn btn-primary btn-sm">Assign</button>
</form>

forms

class AssignForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ('user',)

views

form = AssignForm(request.POST or None)
    if request.POST:
        customer_id = request.POST.get('customer_id', None)
        customer = Customer.objects.get(id=customer_id)
        user = UserProfile.objects.get(id=request.POST.get('user', None))
        customer.user = user
        customer.save()
        # form.save()
        return redirect('user:customer_list')

models

class UserProfile(AbstractUser, UserMixin):
    company = models.ForeignKey(CompanyProfile, on_delete=models.CASCADE, null=True, unique=False)
    username = models.CharField(max_length=500, unique=True)
    first_name = models.CharField(max_length=200)
...
2 Answers

You can filter the user field in the assignForm with:

class AssignForm(forms.ModelForm):
    user = forms.ModelChoiceField(
        queryset=UserProfile.objects.filter(is_active=True)
    )

    class Meta:
        model = Customer
        fields = ('user',)

You can also filter this already at the model level with:

class Customer(models.Model):
    user = models.OneToOneField(
        'UserProfile',
        limit_choices_to={'is_active': True}
    )

In that case you do not need to specify this in the ModelForm(s).

I would strongly advise that you use the form in a POST request to create an instance, so:

customer_id = request.POST.get('customer_id')
if customer_id:
    instance = get_object_or_404(Customer, id=customer_id)
else:
    instance = None
if request.method == 'POST':
    form = AssignForm(request.POST, instance=instance)
    if form.is_valid():
        form.save()
        return redirect('user:customer_list')
# …
Related