2014-11-05 3 views
1

Я написал модель и сохранил некоторые данные, но теперь я не знаю, как запросить объект вместе с моделью внешнего ключа.Django получить значение внешнего ключа

Вот мой models.py:

class Movie(models.Model): 
    link = models.URLField() 
    title = models.CharField(max_length=255, null=True) 
    title_en = models.CharField(max_length=255, null=True) 

class MovieImage(models.Model): 
    movieimage = models.ForeignKey(Movie,null=True,blank=True)    
    img_link = models.URLField(max_length=255, null=True) 

view.py:

def index(request): 
    obj = Movie.objects.all() 
    contacts = get_paginator(request, obj, 10) 
    return render_to_response("movie/index.html", 
          {'title': title ,'obj':obj,'contacts':contacts}, 
          context_instance=RequestContext(request)) 

И movie/index.html:

 {% for o in obj %} 
    <div class="col-md-12 item"> 
     <p><h3>{{ o.title }}</h3></p> 
     <div class="pic"> 
      {{ o.img_link }} <!--I want to show the img_link but don't know how to do this --> 
     </div> 
    </div> 
    {% endfor %} 

Я знаю, что могу использовать o.title, o.entitle, чтобы получить значение. Но я не знаю, как получить значение в модели внешнего ключа оттуда

+0

с вашим набором моделей, вы можете иметь несколько 'MovieImage' для одного 'фильма'. Вы только хотите получить один из них? Я также предполагаю, что когда вы пишете 'YahooMovie', вы имеете в виду' Movie' – cor

+0

yes.It's Movie. Я его отредактировал – user2492364

ответ

1

Первое - Некоторые соглашения об именах - obj - это ужасно общее имя, которое ничего не значит. Вероятно, неплохо использовать что-то вроде movies. Кроме того, если модель имеет имя MovieImage, почему есть поле под названием img_link? Это любопытное повторение, не так ли? Таким образом, было бы лучше:

#models.py 
class MovieImage(models.Model): 
    movie = models.ForeignKey(Movie,null=True,blank=True)    
    src = models.URLField(max_length=255, null=True) 

Тогда вы могли бы сделать:

#views.py 

def index(request): 
    movies = Movie.objects.all() # movies instead of obj 
    contacts = get_paginator(request, movies, 10) 
    return render(request, "movie/index.html", 
        {'title': title ,'movies':movies,'contacts':contacts}) 

наконец, за фактический ответ - имя по умолчанию для соответствующих объектов являются foo_set (в вашем случае, movieimage_set), который вам может перебрать примерно так:

# html 
{% for movie in movies %} 
<div class="col-md-12 item"> 
    <p><h3>{{ movie.title }}</h3></p> 
    <div class="pic"> 
     {% for image in movie.movieimage_set.all %} 
      <img src="{{ image.src }}"> <!-- I am assuming you actually want to show the image, not just the link --> 
     {% endfor %} 
    </div> 
</div> 
{% endfor %} 

пс Возможно, вы заметили, я заменил render_to_response на виды с помощью render. Here's why

+0

Большое вам спасибо! Вы описываете очень ясно. Я знаю, как отредактировать его сейчас – user2492364

+0

@ user2492364 уверенная вещь, с удовольствием помогла =] – yuvi

2

Как я уже говорил вам, у вас может быть больше, чем MovieImage для каждого Movie, сои вам нужно перебирать их.

{% for o in obj %} 
<div class="col-md-12 item"> 
    <p><h3>{{ o.title }}</h3></p> 
    <div class="pic"> 
     {% for image in o.movieimage_set.all %} 
      {{image.img_link}} 
     {% empty %} 
      <p>This obj doesn't have any image</p> 
     {% endfor %} 
    </div> 
</div> 
{% endfor %} 
Смежные вопросы