user2816227
user2816227

Reputation: 173

Django, viewing models from different app

I am super new to python programming and django and i got the basics out of the way. I created a project with two apps, home and video. In my video models.py i have the following data:

class Video(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(blank=True, null=True)

I want to do something with this in my home app in the views.py, such as display the data in an html page and currently it is set up as followed:

from video.models import Video

def display_video(request):
    video_list = Video.objects.all()
    context = {'video_list': video_list}
    return render(request, 'home/home.html', context)

in my home.html

{% if video_list %}
 {% for video in video_list %}
  <p>{{ video.name }}</p>
  <p>{{ video.description }}</p>
 {% endfor %}
{% else %}
 <p>no videos to display</p>
{% endif %}

my home.html always returns "no videos to display"

But when i query Video.objects.all() in my video app it finds 2 objects. any help is appreciated.

Upvotes: 2

Views: 1065

Answers (3)

Kanha Tomar
Kanha Tomar

Reputation: 307

It worked for me without using class. I just did what we normally do.

from django.shortcuts import render
from AllBlogs.models import Post        # getting this post form AllBlogs app 

# Create your views here.

def home (request):
    # sort posts according to date in descending order
    # only a single query is generated and then hit the database that's how this will not affect the performance of database
    latest_blogs = Post.objects.all().order_by("-date")[:3]   
    return render(request,'Home/home.html',{'blog':latest_blogs})  

And this is my template

<!--separated it from the home.html because we can use it in AllBlogs.html
and it  save our work and time by just including without copying the same data several times-->
{% load static %}
<li>
  <!--add field name which we used in models-->
    <article class="blog">
      <a href="{% url 'blogDetails_page' blog.slug %}">     <!--Different slug for different blog as slug will create a different url-->
        <!--dtl filter to add back or url dynamic url creation-->
        <image src="{% static 'images/'|add:blog.image_name %}" alt="{{blog.title}}">
        <div class="blog__content">
          <h3>{{blog.title}}</h3>
          <p>{{blog.excerpt}}</P>
        </div>
      </a>
    </article>
</li>

And this is the Post model

# having post data 
class Post(models.Model):
    title = models.CharField(max_length=150)
    date = models.DateField(auto_now=True)    # put the date in the field at which time we are saving the data
    image_name = models.CharField(max_length=50)          # later on we upload files right now we get images from static folder
    excerpt = models.CharField(max_length=200)
    content = models.TextField(validators=[MinLengthValidator(10)])    # TextFields same like CharField
    slug = models.SlugField(unique=True, db_index=True)     # set it as unique because we are going to use it as a primary key
    author = models.ForeignKey(Author,on_delete=models.SET_NULL,related_name='posts',null=True)      # one to many relation 
    tags = models.ManyToManyField(Tag)              # ManyToManyRelation with tag

    # represent post entry by it post title
    def __str__(self):
        return self.title

Upvotes: 0

user2816227
user2816227

Reputation: 173

I decided to delete the project and started over brand new but this time I used class views instead of function views. I'm not exactly sure why it didn't run but using class views it worked like a charm. So the equivalent in class views as simple as possible is.

 from video.models import Video

 class IndexView(generic.ListView):
   template_name = 'home/index.html'
   context_object_name = 'top_three'

   def get_queryset(self):
    return Video.objects.all()[:3]

Upvotes: 1

itzMEonTV
itzMEonTV

Reputation: 20369

In settings, check the following is there.

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

Upvotes: 0

Related Questions