Wazy
Wazy

Reputation: 494

placeholder on dependent dropdown filter

I have a django filter with a dependent drop down to filter car manufactures and models. The models use a charfield and pulls the cars from a db entry.

enter image description here

I would like a place holder to say manufacture and model on their respected fields.

I cant find much online about doing this. The only post I can find relates to using the choice field on the model which wont work for me.

filter

class CarFilterForm(forms.Form):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['model'].queryset = Post.objects.none()
        if 'model_manufacture_id' in self.data:
            try:
                model_manufacture_id = int(self.data.get('model_manufacture_id'))
                self.fields['model_id'].queryset = CarModels.objects.filter(model_manufacture_id=model_manufacture_id)

            except (ValueError, TypeError):
                pass
        
class carFilter(django_filters.FilterSet):

    class Meta: 
        model = Post
        fields = 'manufacture', 'model'
        form = CarFilterForm

html

<form method="get" id="AllCarsForm" data-cars-url="{% url 'ajax-allcars' %}">
{% render_field myFilter.form.manufacture class="cars-filter-widget" %}
{% render_field myFilter.form.model class="cars-filter-widget" %}
<button class="btn btn-primary" type="submit">Search</button>
</form>

models

class Manufactures(models.Model):
    manufacture_id = models.AutoField(primary_key=True)
    manufacture = models.CharField(max_length=55, default="OEM")


class CarModels(models.Model):
    model_id = models.AutoField(primary_key=True)
    model = models.CharField(max_length=55)
    model_manufacture = models.ForeignKey(Manufactures, on_delete=models.CASCADE)

Upvotes: 1

Views: 163

Answers (2)

Brian Destura
Brian Destura

Reputation: 12068

Try to set the empty_label for the fields:

self.fields['your_field'].empty_label = 'My custom empty label'

Upvotes: 1

vladthelad
vladthelad

Reputation: 165

The simplest method of doing this is to set the model field default to one that corresponds to your fields.

Example:

class Model(models.Model):
    field = models.CharField(max_length=25, choices=CHOICES,
        default=DEFAULT, blank=True)

You can also do this in forms:

self.fields['field'].choices = [('', 'Placeholder Text')] + list(
            self.fields['field'].choices[1:])

Upvotes: 0

Related Questions