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?

Вернуться на верх