我是Django的新手。我正在使用Mezzanine 4.2.3(根据requirements.txt引擎盖下的Django 1.10.8)。我有一个关于电影的Postgres数据库。我想在一个页面上显示10部电影。
我试过询问这个method但是无法找到合适的解决方案,所以现在我正在尝试编写自己的SQL查询。但是,我不知道如何创建上下文。
在下面的代码中,我首先从一个国家/地区列表中随机收集十个国家/地区。接下来,我遍历列表并使用每个国家/地区获取Postgres数据库中的一行。然后,我从每一行创建一个字典,并试图为模板创建上下文。
import psycopg2
from psycopg2 import sql
from .countries import countries # Just a Python list of countries
import random
class MoviesListView(generic.ListView):
model = Movies
connection = psycopg2.connect([DB DETAILS])
c = connection.cursor()
def get_context_data(self, **kwargs):
random_countries = []
while len(random_countries) < 10:
choice = random.choice(countries)
if choice not in random_countries:
random_countries.append(choice.lower())
else:
pass
for country in random_countries:
get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"
c.execute(get_rows, ('%' + country + '%',))
rows = c.fetchall()
for i in rows:
row_dict = {}
row_dict['id'] = i[0]
row_dict['original_title'] = i[3]
row_dict['release_date'] = i[6]
row_dict['production_countries'] = i[8]
# Point at which I'm stuck.
# Context().push(row_dict)
# return Movies.objects.raw(get_rows, ('%' + country + '%',))
template_name = r"movies_crud/movies_list.html"
我在Context()
上阅读了Django文档,我认为Context().push()
或Context.update()
有助于创建上下文。但它没有成功。
我也试过了.raw()
但是它不起作用,因为我试图用for
循环动态生成上下文。
在这种情况下我们如何制作Django上下文?
更新:为了了解我正在尝试做什么,模板看起来像这样:
{% for object in object_list %}
{{ object.title }}
{% endfor %}
它显示10个电影片名。
PS:我在这个问题上工作了16个小时并在提出这个问题之前阅读了我能做的事情。所以,这是一个小问题但是,如果有人在没有留下任何一个字来解释它的情况下放弃一个downvote就不好了。
答案 0 :(得分:1)
试试这个,
def get_context_data(self, **kwargs):
random_countries = []
while len(random_countries) < 10:
choice = random.choice(countries)
if choice not in random_countries:
random_countries.append(choice.lower())
else:
pass
result_list = [] # updated here <<
for country in random_countries:
get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"
c.execute(get_rows, ('%' + country + '%',))
rows = c.fetchall()
for i in rows:
row_dict = {}
row_dict['id'] = i[0]
row_dict['original_title'] = i[3]
row_dict['release_date'] = i[6]
row_dict['production_countries'] = i[8]
result_list.append(row_dict) # updated here <<
return result_list # updated here <<
<强>更新强>
我想{I {{}}}方法在我尝试返回get_context_data()
对象时返回dict
对象。这可能是发生异常的原因。所以如下更新list
,
get_context_data()
因此,def get_context_data(self, **kwargs):
random_countries = []
while len(random_countries) < 10:
choice = random.choice(countries)
if choice not in random_countries:
random_countries.append(choice.lower())
else:
pass
result_list = []
for country in random_countries:
get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"
c.execute(get_rows, ('%' + country + '%',))
rows = c.fetchall()
for i in rows:
row_dict = {}
row_dict['id'] = i[0]
row_dict['original_title'] = i[3]
row_dict['release_date'] = i[6]
row_dict['production_countries'] = i[8]
result_list.append(row_dict)
return {"result": result_list} # UPDATE IS HERE <<
会返回get_context_data()
,如下所示,
dict
答案 1 :(得分:1)
我会这样做:我可以通过context()发送行 `
def get_context_data(self, **kwargs):
random_countries = []
while len(random_countries) < 10:
choice = random.choice(countries)
if choice not in random_countries:
random_countries.append(choice.lower())
else:
pass
objects_list = []
for country in random_countries:
get_rows = "SELECT * FROM movies WHERE LOWER(production_countries) LIKE %s LIMIT 1;"
c.execute(get_rows, ('%' + country + '%',))
rows = c.fetchall()
for row in rows:
object_list.append(row)
return { "objects_list":objects_list }
只是一个标记过滤器来获取给定的ID:
from django import template
register = template.Library()
@register.filter
def get(obj,i):
return obj[i]
在模板中,您可以这样做:
{% for row in objects_list %}
{% for i in row %}
<label>id</label> {{i|get:0}}
<label>original_title</label> {{i|get:3}}
<label>release_date</label> {{i|get:6}}
<label>production_countries</label> {{i|get:8}}
{% endfor %}
{% endfor %}