2017-02-20 34 views
0

我是django的新手,并且使用了很多教程和堆栈溢出来设计我的应用程序。为什么我的django模板将用户设置为与对象相同?

我的应用程序为用户跟踪个案。我需要它能够做的一件事就是以一个用户的身份登录,并查看另一个用户的案例。

当这个页面出现时,通常会说“注销Joe Bloggs”的位,其中Joe Bloggs是登录用户,表示“注销Fitzwilliam Darcy”,其中Fitzwilliam Darcy是用户,我应该查看。

我真的不想继续开发应用程序,直到我修复它,以防万一这是一个潜在问题的症状,将来会导致更多问题。

我会添加我认为所有相关的部分都在这里,但如果还有其他需要的东西,让我知道,我会很乐意编辑。

#urls.py 

url(r'cases/(?P<slug>\w+)',views.UserCasesView.as_view(),name='cases'), 

#views.py 

@method_decorator(login_required,name='dispatch') 
class UserCasesView(generic.DetailView): 

    model = models.User 
    template_name = 'caseworkclub/caseworker_detail.html' 
    slug_field = 'username' 

#models.py 

class User(AbstractUser):           

    association = models.ForeignKey('Association',null=True) 

    def full_name(self): 
     return("{} {}".format(self.first_name,self.last_name) 

    def open_cases(self): 
     return(Case.objects.filter(closed__isnull=True,caseworker=self)) 

嵌塞位是为了使用户名可以根据this answer to another question

这也可能是值得向大家解释,如果models.py位不送人是网址,我已经延长基础用户类和我正在使用它,而不是用户配置文件技术。但是,自从改变了上面的slu bit之后,问题似乎就出现了。

任何帮助非常感谢,正如我所说 - 任何更多的信息,很乐意提供!

詹姆斯

+0

如果您在注销部分改变'user'到'request.user'发生什么呢? – Lucas

+0

你能展示你的模板吗? – GwynBleidD

回答

1

这是因为你没有一个合理的默认覆盖你UserCasesView类的get_context_data()方法。它目前使用的模型名称(也恰好是user)与内置的user变量冲突,该变量由django.contrib.auth.context_processors.auth上下文处理器设置。

the documentation

上下文变量覆盖从模板context处理器

任何变量从get_context_data()优先于上下文变量从上下文处理器值。例如,如果您的视图将模型属性设置为User,则用户的默认上下文对象名称将覆盖来自django.contrib.auth.context_processors.auth()上下文处理器的用户变量。使用get_context_object_name()来避免冲突。

尝试从user改变对象的名称别的东西(如case_user):

class UserCasesView(generic.DetailView): 
    ... 
    context_object_name = 'case_user' 
+0

这解决了它,谢谢!我很惊讶,我只需要改变这一行,而不是添加对我添加的任何地方的引用? –

相关问题