@NyxDeveloper

Как в Django выполнить фильтрацию запроса по нескольким полям из формы?

Имеется табличка с контактами, в которую надо возвращать элементы согласно данным из формы фильтра. Фильтров несколько, по одному на каждое поле модели. Не могу додуматься как мне передавать данные из форм через GET запрос в фильтр чтобы отправлять в шаблон правильный список объектов. Подскажите кто-нибудь, как можно реализовать такую фильтрацию.

contacts.html
<form class="d-flex" method="get" action="{% url 'contacts' %}">
                              {% csrf_token %}
                              {{ subjectFilter.subject }}
                              {{ typeFilter.type }}
                              {{ infoFilter.info }}
                              {{ dateFilter.date }}
                              <button type="submit" class="btn btn-outline-success">Искать</button>
                          </form>


views.py
class ContactListView(View):
    def get(self, request):

        contacts = Contact.objects.all()

        addContact = AddContactForm
        editContact = EditContactForm
        addType = AddTypeForm
        addSubject = AddSubjectForm

        typeFilter = TypeFilter
        subjectFilter = SubjectFilter
        infoFilter = InfoFilter
        dateFilter = DateFilter

        return render(request, 'contacts.html', {
            'contacts': contacts,
            'addContact': addContact,
            'addType': addType,
            'addSubject': addSubject,
            'editContact': editContact,
            'typeFilter': typeFilter,
            'subjectFilter': subjectFilter,
            'infoFilter': infoFilter,
            'dateFilter': dateFilter
        })

    def post(self, request):
        if request.method == 'POST':
            form = AddContactForm(request.POST)
            if form.is_valid():
                # сохранение формы
                contact = Contact()  # новый объект
                contact.type = form.cleaned_data['type']
                contact.subject = form.cleaned_data['subject']
                contact.info = form.cleaned_data['info']
                contact.date = datetime.date.today()
                contact.KEY = contact.id
                contact.save()
                return HttpResponseRedirect('/contacts/')


models.py
class Type(models.Model):
    name = models.CharField('Название', max_length=50)

    def __str__(self):
        return self.name


class Subject(models.Model):
    name = models.CharField('Имя', max_length=50)

    def __str__(self):
        return self.name


class Contact(models.Model):
    KEY = models.IntegerField('Идентификатор', default=None, null=True, blank=True)
    info = models.CharField('Инфо', max_length=100)
    date = models.DateField(default=datetime.date.today(), verbose_name='Дата добавления')
    type = models.ForeignKey(Type, verbose_name='Тип', on_delete=models.CASCADE, default=None)
    subject = models.ForeignKey(Subject, verbose_name='Человек', on_delete=models.CASCADE, default=None)

    def __str__(self):
        return self.info
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bacon
1. Зачем на каждый фильтр форма, может всё таки к одной привести?
2. AddContactForm это же ModelForm, так и работай с ней правильно, а не через cleaned_data
3. Или создай из фильтров словарь и сделай objects.filter(**словарь) или динамически с помощью Q-объекта.
PS и почитай правила сайта, про спам тегами
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы