【问题标题】:How to access data via dot-notation如何通过点符号访问数据
【发布时间】:2016-01-04 22:29:03
【问题描述】:

目标:从assessment_obj拉取video_id,赋值给变量
数据库类型:SQLAlchemy
模型:Assessmentvideo_id 保持多对一关系(多个评估可以使用一个视频)

1.)我正在尝试使用dot.notation从评估中提取video_id 2.)以便我可以使用retrieve方法提取视频信息(例如url)。

目的:视频url将用于通过JINJA2模板/HTML代码进入视频播放器src(如果我不正确地使用行话,我深表歉意,因为我是新手并且正在努力更好地理解这些概念。)

我试图关注OOPdot.notationtutorial,但不确定如何从表中提取数据并分配给变量,而不会意外地重新分配变量。

views.py
表单视图配置。

@view_config(route_name='save_assessment_result', renderer='templates/completedpage.jinja2')
def save_assessment_result(request):
    with transaction.manager:
        assessment_id = int(request.params['assessment_id'])
        assessment_obj = api.retrieve_assessment(assessment_id) # the assessment

        assessment_obj.video_id = video # this right? 
        thevid = api.retrieve_video(video) #retrieves the video via ID
        template_video = int(request.params['video'])
        # how do I get the retrieved video 'thevid' into the template? 

        # more code 

       transaction.commit()
       return HTTPCreated()

模板: templates/assessment_form.jinja2

  <div class="embed-responsive embed-responsive-16by9">
    <iframe width="640" height="360" class="embed-responsive-item" allowfullscreen name='video' src="{{ url }}"></iframe>
  </div>

新:返回assessment_obj。新的 View_Config。
注意: 'videoname': video.videoname, 'length': video.length, 'url': video.url

@view_config(route_name='assessment', request_method='GET', renderer='templates/assessment_form.jinja2')
def assessment_form_view(request):
    with transaction.manager:
        assessment_id = int(request.matchdict['id'])
        assessment = api.retrieve_assessment(assessment_id)
        if not assessment:
            raise HTTPNotFound()
        video_id = int(request.matchdict['id']) # <--- this gives the assessmnet_id and not the video
        video = api.retrieve_video(video_id)
        return {'assessment_id': assessment_id, 'assessment_name': assessment.name, 'assessment_text': assessment.text, 'user_id': assessment.user_id, 'video_id':assessment.video_id, 'categories': ','.join([str(i) for i in assessment.categories]), 'video_id':video_id, 'videoname': video.videoname, 'length': video.length, 'url': video.url}

【问题讨论】:

    标签: python oop syntax pyramid


    【解决方案1】:

    assessment_obj.video_id = video 行中 - video 变量来自哪里?

    看到您正在尝试“从表中提取数据并分配给变量”,我想知道您是否真的尝试将 assessment_obj.video_id 分配给名为 video 的变量。在这种情况下,它应该是另一种方式:

    video = assessment_obj.video_id
    

    然后你的代码几乎开始有意义了。要将数据传递给模板,您只需从视图函数中返回一个字典:

    @view_config(route_name='save_assessment_result', renderer='templates/assessment_form.jinja2')
    def save_assessment_result(request):
        with transaction.manager:
            assessment_id = int(request.params['assessment_id'])
            assessment_obj = api.retrieve_assessment(assessment_id) # the assessment
    
            video_id = assessment_obj.video_id
            thevid = api.retrieve_video(video_id)
            template_video = int(request.params['video'])
            return {
               'thevid': thevid,
               'template_video': template_video
            }
    

    然后在您的模板中,您可以引用这些变量及其成员:

    <iframe ... src="{{ thevid.url }}"></iframe>
    

    【讨论】:

    • 这太棒了...感谢您发现我对变量的反转。哎呀。我注意到这个建议仍然没有拉起视频。没有回溯或错误。我添加了上面通过assessment_obj 可用的属性。
    • {{ thevid.url }} 必须是 {{url}} ...所以添加到返回值中......例如'url': thevid.url, 但由于某种原因仍然无法正常工作
    • @thesayhey:我没有看到您从函数返回字典 - 相反,您返回的是 HTTPCreated(),这是一个自定义响应对象。如果您要返回响应,则根本不使用您的模板。您需要返回要调用的模板的字典。
    • 抱歉给您造成混淆...我使用的是您的确切代码,但我在返回值中添加了'url': thevid.url
    • 我添加了模板名称和评估...以便更好地了解正在发生的事情。
    【解决方案2】:

    根据 Sergey 的惊人指导,我创建了一个新的视图配置,用于加载评估和视频。然后我返回了所需的值。

    工作代码:

    @view_config(route_name='assessment', request_method='GET', renderer='templates/assessment_form.jinja2')
    def assessment_form_view(request):
        with transaction.manager:
            assessment_id = int(request.matchdict['id'])
            assessment = api.retrieve_assessment(assessment_id)
            if not assessment:
                raise HTTPNotFound()
    
            video = assessment.video_id
            print 'test_video_id', video
            video_obj = api.retrieve_video(video)
            print 'test_video_obj', video_obj
    
            return {'assessment_id': assessment_id, 'assessment_name': assessment.name, 'assessment_text': assessment.text, 'user_id': assessment.user_id, 'categories': ','.join([str(i) for i in assessment.categories]), 'url': video_obj.url, 'video_id':video_obj.video_id, 'videoname': video_obj.videoname, 'length': video_obj.length}
    

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2011-04-11
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多