如果在使用mongo,你可能见的最多的除了一般属性的定义以外,ReferenceField这个可以传递对象的属性应该也是很常见的,例如apple=mongo.ReferenceField(Color),这里Color是另一个表,里面存放的是颜色,颜色多了,一个苹果但只对应一个颜色,如此定义即可在后面写入数据时使用。

这两天的模块完成中,有一个表的属性里面有了GenericReferenceField(),是这样定义的choice_object = mongo.GenericReferenceField(),括号里面没有参数,我就上网查啊查的,可是这个属性好像用的很少,网上很难找到关于其怎么用的例子,在mongo文档里面,是这样说的:

“如果你的document里面包含ReferenceField或者GenericReferenceField,默认情况下使用save()方法时会自动应用这些引用的Document的变化,如果你不需要这个特性,可以把cascade设置为False”

如果说是和ReferenceField一样是不可能的,因为我目前所用到的ReferenceField除了上面说的那种以外,还有一种:

parent = mongo.ReferenceField('self', reverse_delete_rule=mongo.CASCADE),就是在父子数据那里使用了。

如今这个没有参数的GenericReferenceField真是令人搞不清楚了一阵时间,终于问师哥了,师哥给说,那个就是你直接choice_object.对象1,choice_object.对象2就创建一个关于它的实例了。在师哥简单说明它的用法之后,结合我自己目前需要解决的,我觉得貌似明白了什么。对象1,对象2,用这个表之前就得有另一个model的对象。终于,关于此问题的模块也解决了。

代码的话就把主要的放来看看,就明白怎么回事了。

class AddConsultChoiceForm(Form):
    choice=SelectField(u'推荐文章题目')
    order=IntegerField(u'顺序号',validators=[DataRequired()])
    submit=SubmitField(u'保存')

    def __init__(self, *args, **kwargs):
        super(AddConsultChoiceForm, self).__init__(*args, **kwargs)
        self.choice.choices = [(i.title, i.title) for i in
                                      ConsultDoc.objects.all()]

填表表单里面获取文章Doc里面的所有标题

@bp.route('/choice/add',methods=['GET','POST'])
@permission_required
def consult_choice_add():
    form=AddConsultChoiceForm()
    if form.validate_on_submit():
        title=form.choice.data
        choice=ConsuletChoiceDoc(choice_object=ConsultDoc.objects(title=title).first(),order=form.order.data)
        choice.save()
        flash(u'添加成功',current_config.FLASH_WARNING)
        return redirect(url_for('consult.consult_choice_list'))
    return tmpl(form=form)

在添加的choice_object就等于此标题对应的实例对象。

这样就可以完成GenericReferenceField的基本实现。就目前我还不知道GenericReferenceField有其他用法没。



再一个就是,今天终于在前台把轮播图解决了。从结果的解决来看之前我为什么一直没解决,原因有:1.没掌握flask框架的模版之间继承的关系;2.css,js正确的引用方法。

就说解决的问题:css,js文件导入的<link>或者<script>都一定要写在大主模版版的<head>里面,不要放在block内容的那个模版

<script type="text/javascript" src="{{ static('consult/turn/func.js') }}"></script>
<link href={{ static('consult/turn/turn.css')  }} rel="stylesheet" type="text/css"/>

就这两个是我找到的轮播图的css和js,这些文件的位置放不正确,一切特效都不会duangduang的出现。