Django: Установите начальное значение выпадающего списка в форме на основе значения в модели
Я работаю над веб-приложением для продажи билетов, используя Django в качестве университета. В нем необходимо, чтобы получатели (тьюторы) могли назначить другого тьютора и изменить статус билета ("Открыт", "В работе", ...).
Текущий куратор и текущий статус сохраняются в модели Ticket:
class Ticket(models.Model):
creator = models.ForeignKey(
Student, null=True, on_delete=models.SET_NULL
)
assignee = models.ForeignKey(
Tutor, on_delete=models.SET_NULL, blank=True, null=True
)
current_status = models.CharField(
max_length=2,
choices=KorrekturstatusEnum.choices,
default=KorrekturstatusEnum.OFFEN,
)
description = models.TextField(
default="Please provide as much detail as possibile."
)
Жизненный цикл билета сохраняется в модели Messages:
class Messages(models.Model):
class ChangeTypeENUM(models.TextChoices):
OPEN = "01", "Open"
ASIGNMENT = "02", "Asignment"
STATUS_CHANGE = "03", "Status change"
MESSAGE = "04", "Message"
class SenderENUM(models.TextChoices):
TUTOR = "01", "Tutor"
STUDENT = "02", "Student"
student = models.ForeignKey(
Student,
on_delete=models.SET_NULL,
null=True,
related_name="student_messages",
)
tutor = models.ForeignKey(
Tutor,
on_delete=models.SET_NULL,
related_name="tutor_messages",
null=True,
blank=True,
)
ticket = models.ForeignKey(
ticket, on_delete=models.CASCADE, related_name="korrektur_messages"
)
text = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(default=timezone.now)
sender = models.CharField(
max_length=2, choices=SenderENUM.choices, default=SenderENUM.STUDENT
)
status = models.CharField(
max_length=2,
choices=KorrekturstatusEnum.choices,
default=KorrekturstatusEnum.OFFEN,
)
change_type = models.CharField(
max_length=2,
choices=ChangeTypeENUM.choices,
default=ChangeTypeENUM.EROEFFNUNG,
)
Изменения в тикете, включая сообщения/комментарии, выполняются с помощью from, здесь я использую модельную форму. Я пытаюсь перезаписать __init__()
:
class MessagesForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
korrektur_id = kwargs.pop("korrektur_id")
korrektur = Korrektur.objects.get(pk=int(korrektur_id))
self.fields["tutor"] = korrektur.bearbeiter
self.fields["status"] = korrektur.aktuellerStatus
class Meta:
model = Messages
fields = ("tutor", "status", "text")
widgets = {
"text": forms.Textarea(attrs={"cols": 50, "rows": 10}),
}
В этой форме я хочу, чтобы текущий преподаватель и статус были значением по умолчанию для соответствующего выпадающего списка.
Урл содержит id/pk тикета, к которому относится изменение:
path("tickets/<int:ticket_id>", views.EditTicketView.as_view())
Класс в views.py
для страницы с формой выглядит так:
class KorrekturBearbeitenView(View):
form_class = MessagesForm
initial = {"key": "value"}
template_name = "backend/edit-ticket.html"
@method_decorator(login_required)
def get(self, request, korrektur_id):
ticket = Ticket.objects.get(pk=ticket_id)
ticket.current_state = ticket.get_current_state_display()
messages = Messages.objects.filter(korrektur=korrektur).order_by(
"created_at"
)
for message in messages:
message.status = message.get_status_display()
# message.sender = message.get_sender_display()
form = self.form_class(initial=self.initial, korrektur_id=korrektur_id)
return render(
request,
self.template_name,
context={
"form": form,
"ticket": ticket,
"tutor": tutor,
"messages": messages,
},
)
Как показано на рисунке, я пытаюсь передать ticket_id в ModelForm, но это не работает. Как я могу получить доступ к объекту билета в функции MessagesForm init()?
Я знаю, что начальное значение формы может быть задано параметром initial
. Но как мне получить его динамически из модели linkes?