Django: Доступ к связанным атрибутам объекта из поля формы в шаблоне?

Я создаю страницу, которая позволяет пользователям редактировать записи о задаче и связанных с ней действиях (у одной задачи может быть много действий), все на одной странице. Вот выдержки из моего кода...

models.py

from django.contrib.auth.models import User

class Task(models.Model):
    category    = models.CharField(max_length=300)
    description = models.CharField(max_length=300)

class Activity(models.Model):
    task  = models.ForeignKey(Task, on_delete=models.CASCADE)
    title = models.CharField(max_length=150)
    notes = models.TextField(blank=True)
    owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

Активность "владелец" связана с User из стандартной модели пользователя Django.

views.py

def manage_task(request, pk):
    task = Task.objects.get(pk = pk)
    TaskInlineFormSet = inlineformset_factory(Task, Activity, 
        form = ActivityForm)
    if request.method == "POST":
        form = TaskForm(request.POST, instance = task)
        formset = TaskInlineFormSet(request.POST, instance = task)
        if form.has_changed() and form.is_valid():
            form.save()
        if formset.has_changed() and formset.is_valid():
            formset.save()
        return redirect('manage_task',pk=task.id)
    else:
        form = TaskForm(instance = task)
        formset = TaskInlineFormSet(instance = task)
    context = {'task': task, 'task_form': form, 'formset': formset}
    return render(request, 'tasks/manage_task.html', context)

И manage_task.html выдержка:

<h2>{{ task.category }}</h2>
<form method="post">
    {% csrf_token %}
    {{ task_form.description }}
    {% for form in formset %}
        {{ form.id }}
        {{ form.title }}</br>
        {{ form.notes }}</br>
        {% if user.id == form.owner.value %}
            You own this Activity!</br>
        {% else %}
            {{ form.owner.first_name }} owns this Activity</br>
        {% endif %}
    {% endfor %}
    <input class="save" type="submit" value="SAVE">
</form>

Возможно, очевидно, что {{ form.owner.first_name }} ничего не возвращает. form.owner по понятным причинам отображается как выпадающий список выбора со всеми пользователями - это своего рода итерируемый объект, поэтому у него нет атрибута first_name.

Думаю, мне нужно иметь поле first_name в каждой форме в наборе форм, чтобы оно правильно связывалось с нужной формой Activity.

Мне кажется, что я должен каким-то образом адаптировать представление, чтобы пройти через все формы в наборе форм и использовать owner.id (если он существует) для доступа к связанному пользователю и добавить атрибут first_name в качестве дополнительного поля в форме? Это не очень похоже на Djangoish, должен быть лучший способ.

Как я могу использовать поле формы form.owner для получения атрибута first_name из объекта User, связанного с Activity, чтобы я мог использовать его в шаблоне?

Не следует брать такое значение из form напрямую. Это может быть рискованно (т.е. меняет реальную жизнь). Но если вы знаете об этом и не против, попробуйте указать на конкретный экземпляр form:

{{ form.instance.owner.first_name }}
Вернуться на верх