Django view only returning incomplete data, only one field to template

旧街凉风 提交于 2020-01-03 06:29:08

问题


I have forked the django-oscar catalogue app to alter the models being used. Not in a major way, and not in a way that would affect pulling data from the database as far as I can see. This seems to be supported by the fact the the django-oscar dashboard still works fine and lets me add and view products. My models.py from my forked app:

from django.db import models

class Collection(models.Model):
    name = models.CharField(max_length=50)
    prod_category = models.CharField(max_length=50)
    description = models.TextField()
    manufacturer = models.TextField()
    num_products = models.PositiveIntegerField()
    image_url = models.URLField()

from oscar.apps.catalogue.abstract_models import AbstractProduct

class Product(AbstractProduct):
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE, null=True)
    multiplier = models.DecimalField(max_digits=2, decimal_places=1, default='2.2')

from oscar.apps.catalogue.models import *

Here is my relevant view from my views.py

def product(request):
    template = loader.get_template('/home/my_app/my_site/main_page/templates/main_page/product.html')
    prods = Product.objects.values_list('categories')
    context={'prods': prods}
    return HttpResponse(template.render(context))

I tried loading from the built in model and my forked model (commenting and uncommenting one or both), neither makes a difference:

#from forkedoscarapps.catalogue.models import Product
from oscar.core.loading import get_class, get_model

Product = get_model('catalogue', 'product')

And the code I am using in the template to display data from the view:

{% for instance in prods %}
    <li><{{ instance.name }}</li>
{% endfor %}

The resulting HTML is:

<li></li>

Which shows it is reaching the for loop, but for some reason no data is returned.

There is at least one category called beds, which displays fine in the django-oscar dashboard. What have I missed in my view?

edit: When I change instance.name to just instance I get the following returned in the HTML:

(1,)

So it is somewhat working, and showing what I assume is the primary key being returned, but why is the name of the field not being returned?


回答1:


Product.objects.values_list('categories') yields a list of id tuples that represent the categories associated with the products in that queryset. That's not what you want to send to the template, you want to send instances, more specifically product instances if I'm not mistaken.

Do Product.objects.all() instead, and just use {{ instance.title }} in the template according to the definition of the oscar model: https://github.com/django-oscar/django-oscar/blob/master/src/oscar/apps/catalogue/abstract_models.py and to what ever you customised over it.



来源:https://stackoverflow.com/questions/53794448/django-view-only-returning-incomplete-data-only-one-field-to-template

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!