2015-06-08 2 views
1

У меня есть models.py, где я указываю класс с 3 ImageFields и 3 CharFields. В CharFields есть идентификаторы видеоизображения youtube, которые я хочу использовать в detail.html. Но я не знаю, как я должен относиться к элементам в details.htmlLoops in django 1.8 views

Мои models.py

from django.db import models 

class Feat(models.Model): 
    feat_name = models.CharField(max_length=200,default="feature1") 
    feat_img1 = models.ImageField(upload_to="%Y/%m/%d",default="1992/08/92") 
    feat_img2 = models.ImageField(upload_to="%Y/%m/%d",default="1992/08/92") 
    feat_img3 = models.ImageField(upload_to="%Y/%m/%d",default="1992/08/92") 
    feat_vid1 = models.CharField(max_length=200,default="3NQRhE772b0") 
    feat_vid2 = models.CharField(max_length=200,default="XU3h3CVI_gI") 
    feat_vid3 = models.CharField(max_length=200,default="vqHIQD4_lu4") 
    num = models.IntegerField(default=0) 

def __str__(self):    
    return self.feat_name 

view.py

from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponseRedirect, HttpResponse 
from django.core.urlresolvers import reverse 
from django.views import generic 
from .models import Feat 


class IndexView(generic.ListView): 
    template_name = 'feature/base.html' 
    context_object_name = 'latest_feat_list' 

    def get_queryset(self): 
     return Feat.objects.order_by('-num')[:1] 

class DetailView(generic.DetailView): 
    model = Feat 
    template_name = 'feature/detail.html' 

base.html

{% if latest_feat_list %} 
<ul> 
{% for feat in latest_feat_list %} 
<a href="{% url 'feature:detail' feat.id %}"><img src="{{ feat.feat_img1.url }}" alt="ac/dc"> 
<a href="{% url 'feature:detail' feat.id %}"><img src="{{ feat.feat_img2.url }}" alt="ac/dc"> 
<a href="{% url 'feature:detail' feat.id %}"><img src="{{ feat.feat_img3.url }}" alt="ac/dc"> 
{% endfor %} 
</ul> 
{% else %} 
<p>No </p> 
{% endif %} 

detail.html

{% for `condition` %} 
<img id="hide" src="http://img.youtube.com/vi/{{ choice.feat_vid1 }}/hqdefault.jpg" data-video="https://www.youtube.com/embed/{{ choice.feat_vid1 }}?autoplay=1" width="480" height="300"/> 
<img id="hide" src="http://img.youtube.com/vi/{{ choice.feat_vid2 }}/hqdefault.jpg" data-video="https://www.youtube.com/embed/{{ choice.feat_vid2 }}?autoplay=1" width="480" height="300"/> 
<img id="hide" src="http://img.youtube.com/vi/{{ choice.feat_vid3 }}/hqdefault.jpg" data-video="https://www.youtube.com/embed/{{ choice.feat_vid3 }}?autoplay=1" width="480" height="300"/> 


{% endfor %} 

мои приложения urls.py

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
url(r'^$', views.IndexView.as_view(), name='base'), 
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'), 

] 

Мне нужно, чтобы отобразить все идентификаторы, передаваемые в Feat классе в detail.html, но не знают, как обращаться к элементам в Feat.

+0

«DetailView» сделает выбранный объект модели «Feat» доступным в переменной контекста «feat». См. ['Get_context_object_name()'] (https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_object_name) , Charfields - это 'feat.feat_vid1',' feat.feat_vid2', ... – dhke

+0

Не могли бы вы объяснить это немного больше.Я новичок, и я не понимаю, как эту функцию можно использовать в подробном просмотре для отображения выбранных видео. – WutWut

+0

Можете ли вы добавить часть своего 'urls.py', где вы ссылаетесь на' DetailView'? Я должен уметь объяснить вам пример. – dhke

ответ

1

Я пытался реализовать

The function is to display three images and when the user clicks over any of them a video related to that image is displayed. I'm sure it can be done more efficiently but I've just started out and this seemed alright.Help me out?

Это немного отличается от того, что вы сделали, но все-таки ... Я не буду описывать код, как он будет принимать очень долго но я буду рад ответить на любой из ваших вопросов. Также я настоятельно рекомендую вам ознакомиться с документами на моделях django.

models.py:

from django.db import models 


class Feat(models.Model): 
    title = models.CharField(max_length=150) 
    image = models.ImageField(upload_to='path/') 
    youtube_link = models.URLField() 
    created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     verbose_name = "Feat" 
     verbose_name_plural = "Feats" 

    def __str__(self): 
     return self.title 

views.py:

from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponseRedirect, HttpResponse 
from django.core.urlresolvers import reverse 
from django.views import generic 
from .models import Feat 


class IndexView(generic.ListView): 
    template_name = 'feature/index.html' 
    context_object_name = 'latest_feats' 

    def get_queryset(self): 
     return Feat.objects.order_by('-created') 

class DetailView(generic.DetailView): 
    model = Feat 
    template_name = 'feature/detail.html' 
    context_object_name = 'feat' 

index.html:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    {% if latest_feats %} 
    <ul> 
     {% for feat in latest_feats %} 
     <a href="{% url 'feature:detail' feat.id %}"><img src="{{ feat.image.url }}" alt="some text"></a> 
     {% endfor %} 
    </ul> 
    {% else %} 
    <p>No </p> 
    {% endif %} 
</body> 
</html> 

detail.html:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
<iframe width="560" height="345" src="{{ feat.youtube_link }}" frameborder="0" allowfullscreen></iframe> 
</body> 
</html> 

urls.py:

urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'), 
] 

Есть много вещей, некрасивых. Например, было бы намного лучше реализовать наследование шаблонов, но я думаю, что этого будет достаточно для прямо сейчас.

+0

При реализации этого кода, в то время как 'index.html' работает, ссылка на' detail.html' дает ошибку 'Reverse for 'detail' с аргументами '(4,)' и аргументами ключевого слова '{}' не найден. 1 образец (ы): ['$ (? P [0-9] +)/$'] '. Любая идея, почему это может произойти? – WutWut

+0

@turtle, прежде всего, я хотел бы посоветовать вам проверить, есть ли у вас шаблон, подобный '' r '^ (? P [0-9] +)/$' ', потому что ваш' 'r $ (? P [ 0-9] +)/$ ''имеет 2' $ 'в одной строке, и это довольно странно, поскольку' $ 'означает конец строки, поэтому я считаю, что вы не можете иметь 2 в 1 строке. Другая распространенная ошибка заключается в том, чтобы использовать пространства имен в ваших URL-адресах проекта, но забыть использовать их в вашем пространстве имен URL: name'. – pythad