我正在尝试创建一个可以检测每篇文章图像颜色的功能,但我很难让它正常工作。
这是我的代码
views.py
from collections import defaultdict
from PIL import Image
def article(request):
context = {'article': Article.objects.all()}
return render(request, 'article.html', context)
def color_detection(request):
article = get_object_or_404(Article, None)
image = article.image
my_image = Image.open(image)
by_color = defaultdict(int)
for pixel in my_image.getdata():
by_color[pixel] += 1
total = 0
for key, x in by_color.items(): #taking the elements of dict
a = [i for i in key] #turning them into multiple lists
if total <= 1: #taking the first list of the list of lists
tuple_of_a = tuple(a)
print(tuple_of_a) #should return the color of one colored pixel of the image something like (r, g, b)
context = {'color':tuple_of_a}
total += 1
else:
break
return render(request, 'article.html', context)
[... other unrelated views ...]
urls.py
urlpatterns = [
url(r'^$', views.article, name="index"),
url(r'^$', views.color_detection, name='color_detection'),
[... unrelated urls ...]
]
template.py
{% for a in article %}
[... unrelated html ...]
<p>{{ a.color }}</p>
{% endfor %}
这是我作为初学者在django中的第一个项目之一,所以我的错误可能是基本的,但我不明白为什么没有调用color_detection()函数,如果你看到代码中的其他错误随意点它,它真的很有帮助。
有任何想法/建议吗?
答案 0 :(得分:1)
怎么称呼它?您只能有一个响应请求的视图,并且您的索引视图已捕获该URL。即使它被调用,它将运行哪一篇文章?你期望get_object_or_404(文章,无)做什么?
您似乎对视图的行为感到困惑;它们响应请求,并且只能将一个视图映射到特定URL。但实际上,这根本不是一种观点;这实际上是一个在特定文章对象上调用的实用函数。因此,它应该是Article模型上的方法;它然后对已经作为self
传递的文章进行操作,并返回一些数据而不是尝试渲染模板:
class Article(models.Model):
... fields and Meta ...
def color_detection(self):
image = self.image
...
return tuple_of_a
现在你的模板就可以了:
{% for a in article %}
[... unrelated html ...]
<p>{{ a.color_detection }}</p>
{% endfor %}
答案 1 :(得分:0)
你没有为它指定一个特定的网址,&#34; index&#34;和&#34; color_detection&#34;映射到根(r'^$'
)。在您的情况views.article
中,Django将调用与url模式匹配的第一个视图。