saini tor
saini tor

Reputation: 233

How to display Foreignkey Data in Django html page?

I want to get data from related foreign-key models, but I am unable to get data from the related model, Please let me know how I can do it. I want to display name value from Model2 table..

here is my models.py file...

class Customer(models.Model):
    cus_name=models.Charfield(blank=True)

class Model1(models.Model):
    namefield=models.Charfield(blank=True)

class Model2(models.Model):
    name=models.CharField(default=None)
    model1=models.Foreignkey(Model1, related_name='model_one', on_delete=models.CASCADE)
   customer=models.Foreignkey(Customer, related_name='customer_data', on_delete=models.CASCADE)

here is my views.py file...

def display_data(request, id):
     test_display=Model1.objects.filter(pk=id).first()
     return render(request, 'page.html', {'test_display':test_display})

here is my test.html file where i am displaying name from Model2 table

<p>{{test_display.model_one.name}}</p>

Upvotes: 1

Views: 1150

Answers (2)

ruddra
ruddra

Reputation: 51948

First, instead of filter(...).first(), use get() or get_object_or_404() method:

 from django.shortcuts import get_object_or_404

 def display_data(request, id):
     test_display=get_object_or_404(Model1.objects.prefetch_related('model_one'), pk)  
     # or Model1.objects.prefetch_related('model_one').get(pk=pk)
     return render(request, 'page.html', {'test_display':test_display})

And in the template, use reverse relation to query Model1 instances:

{% for object in test_display.model_one.all %}
    {{ object.name }}
{% endfor %}

As the relation between Model1 and Model2 is many to one due to ForeignKey, you will get multiple Model1 objects from reverse querying Model2 instance. If you want only one object to stored for Model2, then consider using OneToOne relation.

Upvotes: 1

JSRB
JSRB

Reputation: 2613

First of all you have to fix your syntax error:

def display_data(request, id):
    test_display = Model2.objects.filter(pk=id).first()
    context = {
        'test_display': test_display
    }
    return render(request, 'page.html', context)

# render instead of ender

second of all try to access the Queryset like so:


<p>{{  test_display.name  }}</p>

Upvotes: 0

Related Questions