Waltheof Flatnefr
Waltheof Flatnefr

Reputation: 9

Using attribute from a related model django

At my work everyone has to plan until they've reached their planning target. To make this easier I'm building a planning tool to plan the activities. All the activities have standard durations which are saved in the PlanningActivity model. Now I want to show a list of all the planned activities with the standard duration and also sum up the total planned time in a week. How can I use strd_duration in my added Planning's? I've tried so much, but nothing seems to work...

models.py

class PlanningActivity(models.Model):
    name = models.CharField(max_length=255)
    is_billable = models.BooleanField()
    is_auto_realised = models.BooleanField()
    strd_duration = models.PositiveIntegerField() 

    def __str__(self):
        return self.name

class Planning(models.Model):
    added_by = models.ForeignKey(
        User, related_name='planning_activity', on_delete=models.DO_NOTHING
    )
    activity = models.ForeignKey(
        PlanningActivity, on_delete=models.DO_NOTHING
    )
    date = models.DateField()
    note = models.CharField(max_length=255)

    def __str__(self):
        return str(self.id)

views.py

def home(request):
    planning_form = PlanningForm(request.POST)

    if request.user.is_authenticated:
        planning = Planning.objects.filter(added_by=request.user).order_by('-date')
        contracts = UserContract.objects.filter(assigned_user=request.user)

    else:
        planning = ''
        contract = ''

    if planning_form.is_valid():
        new_planning = planning_form.save(commit=False)
        new_planning.added_by = request.user
        new_planning.save()
        return redirect('/')

    else:
        planning_form = PlanningForm()

    return render(request, 'home.html', {'planning_form': planning_form, 'planning':planning, 'contracts':contracts})

home.html

<table class="table table-striped mt-2">
    <thead class="thead-light">
        <tr>
            <td>Activity</td>
            <td>Date</td>
            <td>Note</td>
            <td>Duration</td>
        </tr>
    </thead>
    <tbody>
        {% for plan in planning %}
                <tr>
                    <td>{{ plan.activity }}</td>
                    <td>{{ plan.date }}</td>
                    <td>{{ plan.note }}</td>
                    <td>{{ plan.activity_id }}</td> <== HERE I WANT TO SHOW strd_duration
                </tr>
        {% endfor %}
    </tbody>
</table>

Upvotes: 0

Views: 24

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476557

You can access the attribute through the foreign key:

{% for plan in planning %}
    <tr>
        <td>{{ plan.activity }}</td>
        <td>{{ plan.date }}</td>
        <td>{{ plan.note }}</td>
        <td>{{ plan.activity.strd_duration }}</td>
    </tr>
{% endfor %}

Note that in the view, you can optimize the number of queries to the database with a .select_related(…) clause [Django-doc]:

planning = Planning.objects.filter(
    added_by=request.user
).select_related('activity').order_by('-date')

Upvotes: 1

Related Questions