不调用Django图像颜色检测功能

时间:2016-01-23 12:20:49

标签: python django

我正在尝试创建一个可以检测每篇文章图像颜色的功能,但我很难让它正常工作。

这是我的代码

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()函数,如果你看到代码中的其他错误随意点它,它真的很有帮助。

有任何想法/建议吗?

2 个答案:

答案 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模式匹配的第一个视图。