简体   繁体   中英

Python Django how can't render my variables from views.py on html file

How can i render my variables from models in a html file, they was rendering a time ago before I made html link slug with class(DetailView) in my views.py

HTML FILE (product.html)

 <h2 class="heading">{{ product.name }}</h2> <div style="clear: both;"><br></div> <div class="block"> <div class="img_preview"> <img src="{{ product.img }}"> <div class="categ"> {% for category in product.category.all %} <a href=""><span>{{ category }}</span></a> {% endfor %} {# <div style="clear: both"><br></div> #} </div> </div> <div id="links"> {% for link in links %} <div class="download_link"> <a href="{{ links.link }}"><span>DOWNLOAD MIRROR NUMBER {{ links.number }}</span></a> </div> {% endfor %} </div> <div style="clear: both"></div> <div id="games"> <div id="video_trailer"> <iframe width="560" height="317" src="{{ product.video_trailer }}" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe> <div id="description"> <span class="title">Description</span> <p>{{ product.description }}</p> </div> </div> <div style="clear: both"><br></div> <div id="system_requirements"> <span class="title">System Requirements</span><br> <p>Processor:&ensp;{{ product.processor }}<br> <br> Graphic Card:&ensp;{{ product.video }}<br> <br> Memory:&ensp;{{ product.ram }}<br> <br> Disk Space:&ensp;{{ product.disk_space }}<br> <br> OS:&ensp;{{ product.oS }} </p> </div> </div> <div id="screenshots"> {% for image in product_images %} <div class="screenshot"> <img width="1920px" height="1080px" src="{{ image.image }}" > </div> {% endfor %} </div> </div> </div> <aside> <div id="news"> <h2 class="heading">News</h2> <div style="clear: both"><br></div> {% for articles in news_articles %} <div id="articles"> <div class="article"> <a href="{{ articles.article.get_absolute_url }}"> <img src="{{ articles.image }}"> <div style="clear: both"></div> <span></span><div style="clear: both"></div> </a> <em>{{ articles.article.created }}</em> 

views.py

from django.shortcuts import render
from products.models import *
from news.models import *
from django.shortcuts import get_object_or_404
from django.views.generic.detail import DetailView

class GameLink(DetailView):
    # model = Product
    # context_object_name = 'product'

    def get_object(self):
        return get_object_or_404(Product, slug__iexact=self.kwargs['slug'])


class ArticleLink(DetailView):
    model = Article
    context_object_name = 'article'

    def get_object(self):
        return get_object_or_404(Article, slug__iexact=self.kwargs['slug'])

def product(request, product_id):
    product = Product.objects.get(id=product_id)
    product_images = ProductImage.objects.filter(is_active=True, is_main=False, id=product_id)
    links = ProductDownload.objects.filter(is_active=True, product=product_id)
    news_articles = NewsImage.objects.filter(is_active=True, is_main=True)
    return render(request, 'products/product.html', locals())

urls.py

from django.contrib import admin
from django.conf.urls import *
from products import views
from products.views import *

urlpatterns = [
   # url(r'^games/(?P<product_id>\w+)/$', views.product, name='product'),
   url(r'^games/(?P<slug>[-\w]+)/$', GameLink.as_view(template_name = 'products/product.html'), name='product'),
   url(r'^articles/(?P<slug>[-\w]+)/$', ArticleLink.as_view(template_name = 'news/article.html'), name='article')
]

models.py

`

 from django.db import models from django.urls import reverse class ProductCategory(models.Model): name = models.CharField(max_length=128, blank=True, null=True, default=None) is_active = models.BooleanField(default=True) def __str__(self): return '%s' % self.name class Meta: verbose_name = 'Category' verbose_name_plural = 'Categories' class Product(models.Model): name = models.CharField(max_length=128, blank=True, null=True, default=None) description = models.TextField(default=None) processor = models.CharField(max_length=300, blank=True, null=True, default=None) video = models.CharField(max_length=300, blank=True, null=True, default=None) ram = models.CharField(max_length=300, blank=True, null=True, default=None) disk_space = models.CharField(max_length=300, blank=True, null=True, default=None) oS = models.CharField(max_length=300, blank=True, null=True, default=None) video_trailer = models.CharField(max_length=10000, blank=True, null=True, default=None) img = models.CharField(max_length=10000, blank=True, null=True, default=None) category = models.ManyToManyField(ProductCategory, blank=True, default=None) is_active = models.BooleanField(default=True) created = models.DateTimeField(auto_now_add=True) slug = models.SlugField(primary_key=True, max_length=250, unique=True, default=None) def __str__(self): return '%s' % self.name def get_absolute_url(self): return reverse('product', args=[str(self.slug)]) class Meta: verbose_name = 'Game' verbose_name_plural = 'Games' class ProductDownload(models.Model): product = models.ForeignKey(Product, blank=True, null=True, default=None, on_delete=False) link = models.CharField(max_length=10000, blank=True, null=True, default=None) is_active = models.BooleanField(default=True) number = models.PositiveIntegerField(blank=True, default=True) def __str__(self): return '%s' % self.product.name class Meta: ordering = ['number'] class Meta: verbose_name = 'Download Link' verbose_name_plural = 'Download Links' class ProductImage(models.Model): product = models.ForeignKey(Product, blank=True, null=True, default=None, on_delete=False) image = models.CharField(max_length=10000, blank=True, null=True, default=None) is_main = models.BooleanField(default=False) is_active = models.BooleanField(default=True) def __str__(self): return '%s' % self.product class Meta: verbose_name = 'Image' verbose_name_plural = 'Images' 

HTML file show only Product variables that are called with {{ product.___ }} but doesn't renders the rest like my links called with : {% for link in links %} {{ link.link }} {% endfor %} or like my articles...

How should I proceed to render on my page needed models.

Image of file paths here

There are different forms to add adicional 'variables' using a DetailView (link)

For example:

class GameLink(DetailView):

    def get_object(self):
        return get_object_or_404(Product, slug__iexact=self.kwargs['slug'])

    def links(self):
        return ProductDownload.objects.filter(is_active=True, product=self.object)

And in product.html:

{% for link in view.links %}
    <div class="download_link">
        <a href="{{ link.link }}"><span>DOWNLOAD MIRROR NUMBER {{ links.number }}</span></a>
     </div>
{% endfor %}

IF you don't want to change HTML, instead of declaring the "def links(self)":

class GameLink(DetailView):

    def get_object(self):
        return get_object_or_404(Product, slug__iexact=self.kwargs['slug'])

    def get_context_data(self, **kwargs):
        context = super(GameLink, self).get_context_data(**kwargs)
        context['links'] = ProductDownload.objects.filter(is_active=True, product=self.object)
        return context

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM