【问题标题】:Why is my django template setting user to the same as object?为什么我的 django 模板将用户设置为与对象相同?
【发布时间】:2017-07-09 03:59:30
【问题描述】:

我绝对是 django 的新手,并且经常使用教程和堆栈溢出来设计我的应用程序。

我的应用会为用户跟踪案例工作。我需要它能够做的一件事是以一个用户身份登录,然后查看另一个用户的案例量。

当此页面出现时,通常会显示“Logout Joe Bloggs”(Joe Bloggs 是登录用户)的位会显示“Logout 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))

slug位是为了让用户名可以在URL中根据this answer to another question

如果models.py 位没有泄露它,我可能还需要解释一下,我已经扩展了基本用户类并且正在使用它,而不是用户配置文件技术。不过,问题似乎是在更改上面的 slug 位后出现的。

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

詹姆斯

【问题讨论】:

  • 如果在注销部分将user 更改为request.user 会发生什么?
  • 你能展示你的模板吗?

标签: python django


【解决方案1】:

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

来自the documentation

上下文变量覆盖来自模板上下文处理器的值

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

尝试将对象名称从 user 更改为其他名称(例如 case_user):

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

【讨论】:

  • 这样就解决了,谢谢!很惊讶我只需要更改那一行,而不是添加对我在任何地方添加的内容的引用?
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 2015-02-05
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2014-05-24
  • 2014-10-27
  • 2021-11-13
相关资源
最近更新 更多