Python Django:列出本地文件夹中的文档

Python Django:列出本地文件夹中的文档,python,django,python-3.x,django-templates,django-views,Python,Django,Python 3.x,Django Templates,Django Views,我一直在试图找到一种方法,将本地文件夹中的文档显示到网页上。我从两个方面对此感到疑惑:一个是使用django的ListView,但在本例中我没有使用模型,所以我不确定它是否有效。另一种方法是通过我制作的这个列表方法,但是我很难将正确的内容(标题、日期)放到网页上。它们出现在我创建的列表中,但不会翻译到网页上。这只是一个空白页。这是我的密码: 视图.py import os, string, markdown, datetime from P1config.settings import STAT

我一直在试图找到一种方法,将本地文件夹中的文档显示到网页上。我从两个方面对此感到疑惑:一个是使用django的ListView,但在本例中我没有使用模型,所以我不确定它是否有效。另一种方法是通过我制作的这个列表方法,但是我很难将正确的内容(标题、日期)放到网页上。它们出现在我创建的列表中,但不会翻译到网页上。这只是一个空白页。这是我的密码:

视图.py

import os, string, markdown, datetime
from P1config.settings import STATICBLOG_COMPILE_DIRECTORY,STATICBLOG_POST_DIRECTORY,STATICBLOG_STORAGE

def doclist(request):

    mdown =  markdown.Markdown(extensions = ['meta','extra', 'codehilite', PyEmbedMarkdown()])
    posts = []

    for item in os.listdir(STATICBLOG_POST_DIRECTORY):
        if item.endswith('.md'):
            continue
        try:           
            with open(os.path.join(STATICBLOG_POST_DIRECTORY, item)) as fhandle:
                content = fhandle.read() # (opening and reading the ENTIRE '.md' document)
                mdown.convert(content)   # (converting file from '.md' to ".html")

                post = { 'file_name' : item }

                if 'title' in mdown.Meta and len(mdown.Meta['title'][0]) > 0:
                    post['title'] = mdown.Meta['title'][0]
                else:
                    post['title'] = string.capwords(item.replace('-', ' '))
                if 'date' in mdown.Meta:
                    post['date'] = mdown.Meta['date'][0]
                    post['date']= datetime.datetime.strptime(post['date'], "%Y-%m-%d")
                posts.append(post) 
        except:
            pass

    from operator import itemgetter
    posts = sorted(posts, key=itemgetter('date')) 
    posts.reverse()

    return render(  
        request,
        'list.html',
        {'post' : posts}
    )
list.html

{% extends 'base.html' %}

{% block content %}
    {% if post %}
        {% for i in post %}
        <h2>{{post.title}}</h2>
        <p class="meta">{{post.date}}</p>
        {% endfor %}
    {% endif %}
{%  endblock %}
我有两个问题:

  • 你能找出我在这段代码中出错的地方吗
  • 有没有其他方法可以让我这样做?这可能是一种从本地文件夹列出文档的低效方法,因此我也愿意接受其他选项
    任何形式的帮助都将不胜感激。谢谢

    听起来您已经很熟悉了,可以使用
    ListView
    执行此操作。您可以在没有模型的情况下使用
    ListView
    ,如文档各部分所述(“不一定是查询集”):

    获取此视图的项目列表。这必须是一个iterable,并且可能是一个queryset(其中将启用queryset特定的行为)

    因此,您应该能够执行以下操作:

    class MyListView(generic.ListView):
        template_name = 'foobar.html'
    
        def get_queryset(self):
            return [1, 2, 3]
    
    你的例子有什么不对。。。事实上,您在内部for循环中引用的是
    post
    ,而不是您定义为实际post的
    i

    这很混乱,因为在模板上下文中将python
    posts
    变量重命名为
    post
    ,然后将其作为
    i
    进行迭代


    模板上下文中的
    posts
    只是一个列表,没有名为
    post的属性、键等。title

    post
    是dict对象的数组。所以

    {% extends 'base.html' %}
    
    {% block content %}
        {% if post %}
            {% for i in post %}
            <h2>{{i.title}}</h2>
            <p class="meta">{{i.date}}</p>
            {% endfor %}
        {% endif %}
    {%  endblock %}
    
    {%extends'base.html%}
    {%block content%}
    {%if post%}
    {post%中的i为%1}
    {{i.title}}
    

    {{i.date}

    {%endfor%} {%endif%} {%endblock%}
    感谢您的回复。我完全错过了,所以谢谢你抓住了这个错误!!原来那是我的大障碍。天哪……我不敢相信我忽略了这一点;但这就是为什么我喜欢这个社区:额外的眼睛。非常感谢。我设法修正了我的观点,并让列表开始运行。。。至于ListView,我对它有点熟悉,但只在模型实现方面。我几乎看不到它被用于其他方式,我也不完全确定我能在模型之外使用它,但你的信息确实让我好奇。我要看看我能用他们做些什么。Django文档,imo,不是完全有用的b/c,似乎他们希望您在阅读之前了解一定数量的信息。@JellisHeRo我发现Django文档是文档质量的圣杯之一。我特别喜欢他们指出其他医生认为你知道的东西。也就是说,CBV文档需要一些知识才能继续。每个CBV都由列出的其他通用混合体组成,了解这些混合体的工作原理是理解CBV的关键。
    {% extends 'base.html' %}
    
    {% block content %}
        {% if post %}
            {% for i in post %}
            <h2>{{i.title}}</h2>
            <p class="meta">{{i.date}}</p>
            {% endfor %}
        {% endif %}
    {%  endblock %}