Как отфильтровать данные из модели на основе выбора пользователя веб-страницы в форме в Django?
У меня есть модель данных с записями, и эти записи представлены на веб-странице. Я создал функцию, которая подготавливает таблицу с записями из модели данных и возвращает требуемую структуру этих данных в веб-странице pu.html.
И я хотел бы отфильтровать эти данные на основе выбора пользователя в форме на той же веб-странице.
Поэтому я создал вторую модель Manager_selection, где хранится выбор пользователя, и я получаю из этой модели последнее значение, на основе которого данные фильтруются в моей функции, которая готовит таблицу с записями.
А мне нужно как-то включить функцию для формы в Views, чтобы иметь возможность сохранять выбор пользователя и на основе которого данные будут фильтроваться, так как мой View основан на модели Data, а форма основана на модели Manager_selection.
models.py:
Модель данных - включает детальные данные для каждого проекта (дата, номер_документа, сумма, проект, счет, компания,...)
Модель проектов - включает данные о проекте (код, mo - менеджер проекта, vps - менеджер сайта, ...). Эта модель связана с моделью данных связью 1:N, поэтому один проект может иметь несколько записей Data
.Модель Employee - включает первое, второе имя и должность - связана с моделью Project 1:N - вы можете выбрать mo (менеджер проекта) и vps (менеджер сайта) из модели Employee для каждого проекта, и каждый проект имеет только одного mo и vps.
Manager_selection - эта модель включает mo (менеджер проекта) и vps (менеджер сайта), выбранные пользователем в форме - я получаю последнее значение из этой модели и фильтрую на основе этих двух имен данные, которые представлены на веб-странице.
class Manager_Selection(models.Model):
def mo_selection_list_creation():
mo_data = Employees.objects.values()
mo_list = []
for i in mo_data:
if i["position"] == "MO":
mo_list.append([str(i["name"]+" "+i["surname"]), str(i["name"]+" "+i["surname"])])
return mo_list
def vps_selection_list_creation():
vps_data = Employees.objects.values()
vps_list = [], ]
for i in vps_data:
if i["position"] == "VPS":
vps_list.append([str(i["name"]+" "+i["surname"]), str(i["name"]+" "+i["surname"])])
return vps_list
mo_list = mo_selection_list_creation()
vps_list = vps_selection_list_creation()
mo = models.CharField("MO", choices=mo_list, max_length=50, blank=True, null=True)
vps = models.CharField("VPS", choices=vps_list, max_length=50, blank=True, null=True)
def __str__(self):
return f"{self.mo}, {self.vps}"
Views - принимает данные из модели данных и подготавливает таблицу на основе функции table_creation();
class PuView(LoginRequiredMixin, FormView):
template_name = "pu.html"
model = Data
success_url = reverse_lazy("pu")
form_class = ManagerSelectionForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
entry_data = Data.objects.values()
try:
mo = Manager_selection.objects.values().last()["mo"]
vps = Manager_selection.objects.values().last()["vps"]
except:
mo = None
vps = None
try:
data = table_creation(entry_data, mo, vps)
except:
data = 0
context["data"] = data
return context
форма основана на модели Manager_Selection:
class ManagerSelectionForm(ModelForm):
class Meta:
model = models.Manager_Selection
fields = ("mo", "vps")
и форма включена в html страницу:
<form method="post">
{% csrf_token %}
<div class="input-group p-0 m-0">
<span class="pt-2 pe-2">Výběr MO, VPS: </span>
{{ form.mo }}
{{ form.vps }}
<button class="btn btn-outline-dark" type="submit"><i class="fa-solid fa-file-import"></i> Odeslat</button>
</div>
</form>
Подведем итоги:
- есть ли какой-то способ сделать это более простым способом? - чтобы иметь возможность фильтровать записи из модели данных на основе выбора пользователя веб-страницы? если мой способ подходит, как включить функцию для сохранения данных из формы в модель Manager_selection в моем представлении, которое основано на другой модели Data и я использую там функцию get_context_data()?