django使用mongoengine

2017-03-11  本文已影响2013人  Jlan

数据库配置

DBNAME = 'Questions'

models

# from django.db import models
from mongoengine import *
from QADoorWebDjango.settings import DBNAME

connect(DBNAME)

# Create your models here.
class Questions(Document):

    _id = IntField(primary_key=True)
    url = URLField()
    title = StringField()
    content = StringField()
    is_solved = BooleanField(default=0)
    answer_count = IntField()
    view_count = StringField()
    vote_count = StringField()
    tags = ListField()
    answers = ListField()
    source = StringField()

    meta = {'collection': 'questions'}  # 指明连接数据库的哪张表

for i in Questions.objects[:10]:  # 测试是否连接成功
    print(i._id)

分页

1. 使用mongoengine自带的分页功能

page = request.GET.get('page', 1)
pagination = Questions.objects.paginate(page=page, per_page=PER_PAGE)
return render(request, 'app/index.html', {'questions': pagination.items, 'pagination': pagination})

问题:这里Questions.objects被当成了django orm的QuerySet类型,会提示AttributeError: 'QuerySet' object has no attribute 'paginate',暂时还不知道改怎么解决。

<div class=pagination>
        {% if pagination.has_prev %}
            <li class="waves-effect"><a href="./{{ pagination.prev_num }}" >上一页</a></li>
        {% endif %}

        <li class="active"><strong><a href="">当前页 {{ pagination.page }} of {{ pagination.pages }}.</a></strong></li>

        {% if pagination.has_next %}
            <li class="waves-effect"><a href="./{{ pagination.next_num }}">下一页</a></li>
        {% endif %}
   </div>

2. 使用django的分页功能

from django.core.paginator import Paginator
question_list = Questions.objects
page = request.GET.get('page', 1)
paginator = Paginator(question_list, PER_PAGE)
questions = paginator.page(page)
context = {
    'questions': questions,
    'total_pages': paginator.page_range
}
return render(request, 'app/index.html', context)
<ul class="pagination">
    {# 上一页 #}
    {% if questions.has_previous %}
        <li class="waves-effect"><a href="?page={{ questions.previous_page_number }}"><i class="material-icons">chevron_left</i></a></li>
    {% else %}
        <li class="disabled"><a href="#!"><i class="material-icons">chevron_left</i></a></li>
    {% endif %}
    {% for page in total_pages %}
        {% if page %}
            {% ifequal page questions.number %}
                {# 当前页页 #}
                <li class="active"><a>{{ page }}</a></li>
            {% else %}
                {# 指定页 #}
                <li class="waves-effect"><a href="?page={{ page }}">{{ page }}</a></li>
            {% endifequal %}
        {% else %}
            <li class="waves-effect"><a href="#">...</a></li>
        {% endif %}
    {% endfor %}
    {# 下一页 #}
    {% questions.has_next %}
        <li class="waves-effect"><a href="?page={{ questions.next_page_number }}"><i class="material-icons">chevron_right</i></a></li>
    {% else %}
        <li class="disabled"><a href="#!"><i class="material-icons">chevron_right</i></a></li>
    {% endif %}
</ul>

其他问题

1. object._id问题

在django模板中使用mongodb对象的_id属性时会提示:Variables and attributes may not begin with underscores: 'value._id'

from django import template
register = template.Library()
@register.filter(name='private')
def private(obj, attribute):
    return getattr(obj, attribute)

在模板中使用

{{ value|private:'_id' }}

参考

上一篇 下一篇

猜你喜欢

热点阅读