大家是如何获取context的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大家是如何获取context的?相关的知识,希望对你有一定的参考价值。

如题,很多地方都要context,Activity中 getApplicationContext() 就可以了。那其他地方呢,如何在任何地方任何情况下都获取到context?或许是我理解的错误context必须跟本个类有关、?thanks in advance

Context是一个抽象基类,我们通过它访问当前包的资源(getResources、getAssets)和启动其他组件(Activity、Service、Broadcast)以及得到各种服务(getSystemService),当然,通过Context能得到的不仅仅只有上述这些内容。对Context的理解可以来说:Context提供了一个应用的运行环境,在Context的大环境里,应用才可以访问资源,才能完成和其他组件、服务的交互,Context定义了一套基本的功能接口,我们可以理解为一套规范,而Activity和Service是实现这套规范的子类,这么说也许并不准确,因为这套规范实际是被ContextImpl类统一实现的,Activity和Service只是继承并有选择性地重写了某些规范的实现。

看下继承关系:

因此 Service本身就是Context的实现,所以只需要调用this

参考技术A android这种低耦合的设计,在大部分情况下你是不需要在activity之外访问这些context,工具类的初始化使用applicationcontext就行了,如果你使用的很多的话,那就应该停下来想想是不是可以改进一下 参考技术B 可以在Activity定义一个静态context获取是本类的context在其他任何类可以直接用这个 参考技术C Context和模块有关,getBaseContext```getAplicationContext

如何在ListView中正确使用get_context_data来获取Django中的相关实例

我试图使用ListView和ContextMixin为此创建一个视图,但我不确定这是否是一种正确的方法。目标是获取CourseImplementation中的所有字段以及在TeacherCourseImplementation中与其连接的teacherid问题是我在浏览器上打开模板时看不到部件implement.teacherid。如果我想得到老师,我不知道该怎么做。

class ImplementView(generic.ListView):
    template_name = 'schedule/implement.html'
    context_object_name = 'all_implements'

    def get_queryset(self):
        return CourseImplementation.objects.all()

    def get_context_data(self, **kwargs):
        context = super(ImplementView, self).get_context_data(**kwargs)
        context['teacherid'] = TeacherCourseImplementation.objects.all()
        return context

这是我的models.py

class CourseImplementation(models.Model):
    courseid = models.ForeignKey(Course, on_delete=models.CASCADE, db_column='courseid', )
    roomid = models.ForeignKey('Room', models.DO_NOTHING, db_column='roomid', blank=True, null=True)
    note = models.CharField(max_length=10, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'course_implementation'

    def __str__(self):
        return self.pk + ' - ' + self.courseid

class TeacherCourseImplementation(models.Model):
    teacherid = models.ForeignKey(Teacher, on_delete=models.CASCADE, db_column='teacherid', primary_key=True)
    course_impleid = models.ForeignKey(CourseImplementation, on_delete=models.CASCADE, db_column='course_impleid')
    p1 = models.IntegerField(blank=True, null=True)
    p2 = models.IntegerField(blank=True, null=True)
    p3 = models.IntegerField(blank=True, null=True)
    p4 = models.IntegerField(blank=True, null=True)
    p5 = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'teacher_course_implementation'
        unique_together = (('teacherid', 'course_impleid'),)

    def __str__(self):
        return self.pk + ' - ' + self.teacherid

这是我的模板:

<ul>
    {% for implement in all_implements %}
        <div class="col-sm-5 col-lg-5">
            <div class="thumbnail">
                <p>{{ implement.teacherid }} - {{ implement.courseid }}</p>
            </div>
        </div>
    {% endfor %}
</ul>

谁可以帮我这个事。谢谢。

答案

您可以使用TeacherCourseImplementation访问TeacherCourseImplementation项目implement的相关implement.teachercourseimplementation_set.all()项目(不要在模板中使用括号):

{% for implement in all_implements %}
    <div class="col-sm-5 col-lg-5">
        <div class="thumbnail">
            <p>{{ implement.courseid }}</p>
            {% for teacher_course_implementation in implement. teachercourseimplementation_set.all %}
              {{ teacher_course_implementation.teacherid }}
              ...
            {% endfor %}
        </div>
    </div>
{% endfor %}

有关更多信息,请参阅following relationships backwards上的文档。

这将为查询集中的每个项生成一个额外的查询。您可以使用prefetch_related来避免这种情况。

def get_queryset(self):
    return CourseImplementation.objects.all().prefetch_related('teachercourseimplementation_set')

由于您通过TeacherCourseImplementation实例访问所有CourseImplementation实例,因此您无需覆盖get_context_data

以上是关于大家是如何获取context的?的主要内容,如果未能解决你的问题,请参考以下文章

Android中,Context,啥是Context

CoreData Context合并后如何获取对象

如何在Fragment中获取context

如何在Fragment中获取context

Android开发小技巧-------如何获取全局的Context

如何在我的 ModalRoute 中获取 Provider<MyBloc>.of(context)