2015-07-12 21 views
1

我是Flask和SQLalchemy的新手。想要使用显示分配给该照片的所有标签的单张照片的网页。烧瓶SQLalchemy - 多对多 - 用所有标签(或所有帖子的博客等)显示照片

我有SQLalchemy工作正常与MYSQL数据库。奈斯利检索记录等

我需要用瓶/ SQLAlchemy的工作流程帮助:

模型 - >视图(从网址如观看输入/照片的身份证件) - >模板 - >网页

该型号如下:

class Photos(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    filename = db.Column(db.String(100)) 
    tags = db.relationship(
     'Tags', 
     secondary=photo_tags, 
     backref='photos') 


class Tags(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    tagname = db.Column(db.String(100)) 

photo_tags = db.Table('photo_tags', 
    db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')), 
    db.Column('photo_id', db.Integer, db.ForeignKey('photos.id')) 
) 

我的看法如下:

@app.route('/phototags/<int:id>') 
#@login_required 
def phototags(id=None): 
    photo_tags = Tags.query.filter(Tags.photos).filter(id == id).all() 
    return render_template(
     'phototags.html', 
     title='PhotoTags', 
     message='Your application description page.', 
     photo_tags = photo_tags 
    ) 

我的模板如下:

{% extends "layout.html" %} 
{% block content %} 
<h2>{{ title }}.</h2> 
<h3>{{ message }}</h3> 
      {% for phototag in photo_tags %} 
      <div style="float:left; class=" img-responsive"> 
       <p><a href="{{ url_for('photo', id=phototag.id)}}">photo</a></p> 
       <p><a href="{{ url_for('tag', id=phototag.id)}}"></p>tag</a></p> 
       <img src="static/photos/{{ phototag.id }}" width="100" height="100"> 
      </div> 
      {% endfor %} 
{% endblock %} 

我敢肯定的模型和关联表/模型是正确安装。

该模板并不完美,因为它目前似乎显示照片ID的标签ID。我试图做'phototag.photo_id'或'phototag.filename',但不出来。显然,查看查询并没有做到这一点。

所以视图是我需要帮助的。查询是否正确?它是否正确获取url传递参数为photo_id?

我的测试数据很简单。我有一张照片记录与photos.id = 1

这有2个相关Phototags记录:phototags.id = 1(tag.id = 1),phototags.id = 2(tag.id = 2)

当我通过url http://localhost:5555/phototags/1我的查看查询通过标记id,但更改传递的参数总是获得相同的标记id,例如phototags/2也获得相同的两个标记。所以查询显然是不正确的。

我看过几十个例子,它们都与我想要的完全不同。我所看到的所有示例/教程/ SO问题/答案都不显示模型,视图和模板如何协同工作以获得我想要的内容。他们要么:

  • 越来越相反如等价的照片通过标签(想在照片标签)
  • 是由照片得到标签(我甚至不认为我得到的是)
  • 只是查询
  • 有另一个SQLAlchemy的符号,包括代替“db.model”会议'或“基地”

我想作为输出照片的身份证,所以我可以显示照片和名字等,也显示一个列表与该照片相关联的标签,例如用逗号分隔的列表。

我很难找到一个演示/示例/教程/ github项目,引导我通过我需要的工作流程。

任何人都可以看到我可以从url参数获取照片id,然后查询我的模型以获取相关标签的示例吗?

回答

2

从您描述的用例中查看照片而不是photo_tags似乎更合适。 使用浏览功能

@app.route('/phototags/<int:id>') 
def phototags(id=None): 
    photo = Photo.query.get(id) 
    return render_template(
     'phototags.html', 
     title='PhotoTags', 
     message='Your application description page.', 
     photo = photo 
    ) 

然后你可以显示照片,并使用“标签”在HTML模板关系遍历其标签:

{% extends "layout.html" %} 
{% block content %} 
<h2>{{ title }}.</h2> 
<h3>{{ message }}</h3> 
      <img src="static/photos/{{ photo.id }}" width="100" height="100"> 
      {% for phototag in photo.tags %} 
      <div style="float:left; class=" img-responsive"> 
       <p><a href="{{ url_for('photo', id=phototag.id)}}">photo</a></p> 
       <p><a href="{{ url_for('tag', id=phototag.id)}}"></p>tag</a></p> 
      </div> 
      {% endfor %} 
{% endblock %} 

注意,我在查询中使用get函数为照片。它基本上与

Photo.query.filter(id == id).first() 

将视图函数和模板从光标标记重命名为照片也是有意义的。

如果您想要显示标签的所有图像,则必须颠倒逻辑,查询标签并迭代照片。应该是可能的,因为你定义了一个backref。

+0

啊,好吧,这太容易了。这就是如何使用Photos模型中的标签关联(和backref)。我不会想到使用'photo.tags',因为我不知道该关联可以通过标记关联访问photo_tags表。现在做出总体感觉。谢谢! – curtisp

相关问题