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 }}