Задать вопрос
rusyska55011
@rusyska55011

Как вывести форму Select c условием в Django3?

У меня есть форма заполнения, где есть Select, в котором выводится поле, унаследованное с другой модели. Объекты должны иметь свою актуальность, то есть если дата "меньше" сегодняшней, то объект не должен выводиться в теге select на сайте. Он у меня выводит все.
Вопрос в том как сделать так, чтобы он выводил только актуальные ивенты, то есть как создать условие?
6050cd041eb00810625230.png

Главная модель
import datetime

from django.db import models

from TimeTable.models import TimeTable

class Application(models.Model):
    name = models.CharField(max_length = 100, verbose_name = 'Имя', null = True)
    surname = models.CharField(max_length = 100, verbose_name = 'Фамилия', null = True)
    middlename = models.CharField(max_length = 100, verbose_name = 'Отчество', null = True)
    number = models.CharField(max_length = 20, null = True)

    event = models.ForeignKey(TimeTable, on_delete = models.PROTECT, verbose_name = 'Мероприятие')

    comment = models.TextField(verbose_name = 'Комментарий', null = True, blank = True)
    date = models.DateField(verbose_name = 'Дата', default = datetime.date.today)

    def __str__(self):
        return str(self.name) + ' ' + str(self.middlename)

    class Meta:
        verbose_name_plural = 'Заявки'
        verbose_name = 'Заявка'
        ordering = ['-date']


Модель, которая связана с этой моделью
from django.db import models

class TimeTable(models.Model):
    start = models.CharField(max_length = 100, verbose_name = 'Старт')
    finish = models.CharField(max_length = 120, verbose_name = 'Финиш')

    date = models.DateField(verbose_name = 'Дата')
    time = models.TimeField(verbose_name = 'Время')
    meeting_place = models.CharField(max_length = 120, verbose_name = 'Место сбора')

    def __str__(self):
        return str(self.start) + ' / ' + str(self.finish)

    class Meta:
        verbose_name_plural = 'Таблицы'
        verbose_name = 'Таблица'
        ordering = ['-date']


views.py
from django.shortcuts import render, HttpResponse, redirect

from .forms import ApplicationForm

def index(request):
    error = ''
    if request.method == 'POST':
        form = ApplicationForm(request.POST)

        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            error = 'ERROR'

    form = ApplicationForm()

    context = {
        'form' : form,
        'error' : error
    }

    return render(request, 'Application/Application.html', context)


forms.py
from django.forms import ModelForm, TextInput, Textarea, Select

from .models import Application

class ApplicationForm(ModelForm):
    class Meta:
        model = Application
        fields = ['name', 'surname', 'middlename', 'number', 'event', 'comment']

        widgets ={
            'name' : TextInput(attrs = {
                'class' : 'form-application',
                'placeholder' : 'Имя'
            }),
            'surname' : TextInput(attrs = {
                'class' : 'form-application',
                'placeholder' : 'Фамилия'
            }),
            'middlename' : TextInput(attrs = {
                'class' : 'form-application',
                'placeholder' : 'Отчество'
            }),
            'number' : TextInput(attrs = {
                'class' : 'form-application',
                'placeholder' : 'Номер'
            }),
            'event' : Select(attrs = {
                'class' : 'form-application',
                'selected' : 'Выберите мероприятие'
            }),
            'comment' : Textarea(attrs = {
                'class' : 'form-application',
                'placeholder' : 'Комментарий (необязательно)'
            }),

        }
  • Вопрос задан
  • 505 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
rusyska55011
@rusyska55011 Автор вопроса
Спасибо за подсказку Django. Как вывести поле ForeignKey в шаблон с определённым условием?
Надо обратиться к форме и изменить объекты:
views.py:
from django.db.models import Q
from datetime import date, datetime

day_today = date.today()
time_now = datetime.now().time()

form = ApplicationForm()
# Фильтруем прошедшие ивенты (Конструкця с Q и палочкой позволяет подставить ИЛИ)
form.fields['event'].queryset = TimeTable.objects.filter((Q(date = day_today) & Q(time__gt = time_now)) | Q(date__gt = day_today))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы