Django-limit_choices_to С ForeignKey на основе различных ссылок
Я делаю сайт по управлению зданиями на Django. У меня есть страница, которая является DetailView
для каждого здания. На странице DetailView
есть ссылка для добавления рабочего задания на ремонт. При создании рабочего задания я хотел бы, чтобы оно фильтровалось только для той страницы здания, с которой я пришел. Например, со страницы "здание/1", нажав на ссылку рабочего задания, можно было бы увидеть и выбрать только комнаты в здании с пк = 1.
views.py
from django.shortcuts import render
from .models import Building, Room, Task, Task_Note
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView
# Create your views here.
class BuildingList(ListView):
model = Building
template_name = "dorm/buildings.html"
class BuildingDetail(DetailView):
model = Building
template_name = "dorm/building.html"
class TaskAdd(CreateView):
model = Task
fields = ["time", "room", "work_request_id", "description"]
template_name = "dorm/add_task.html"
models.py
from django.db import models
from django.db.models.fields import DateTimeField, IntegerField, CharField, TextField
from django.db.models.fields.related import ForeignKey
import datetime
from django.urls.base import reverse
error = "Error"
# Create your models here.
class Building(models.Model):
number = IntegerField(null = True, blank = True)
@property
def number_of_rooms(self):
try:
return Room.objects.filter(building = self).count()
except:
return error
@property
def number_of_active_tasks(self):
x = 0
q = Task.objects.all()
for i in range(len(q)):
if q[i].building == str(self) and q[i].status == "A":
x += 1
return x
def __str__(self):
return f"{self.number}"
class Room(models.Model):
number = IntegerField(null = True, blank = True)
building = ForeignKey(Building, null = True, blank = True, on_delete = models.CASCADE)
def __str__(self):
return f"{self.building}/{self.number}"
class Task(models.Model):
room = ForeignKey(Room, null = True, blank = True, on_delete = models.CASCADE)
work_request_id = IntegerField(null = True, blank = True)
time = DateTimeField(null = True, blank = True, default = datetime.datetime.now())
description = CharField(max_length = 1000, null = True, blank = True)
STATUS_CHOICES = [
("A", "Active"),
("C", "Complete")
]
status = CharField(max_length = 1, null = True, blank = True, choices = STATUS_CHOICES, default = "A")
@property
def building(self):
try:
return f"{self.room.building}"
except:
return error
def __str__(self):
return f"{self.work_request_id}"
def get_absolute_url(self):
return reverse("buildings")
#________________________________NOTES__________________________________
class Task_Note(models.Model):
task = ForeignKey(Task, null = True, blank = True, on_delete = models.CASCADE)
time = DateTimeField(null = True, blank = True)
description = TextField(null = True, blank = True)
def __str__(self):
return f"{self.task.pk}"