型号limit_choices_to = {'用户':用户}

时间:2020-03-06 15:00:03  来源:igfitidea点击:

我浏览了所有文档,还浏览了IRC频道(顺便说一句,很棒的社区),他们告诉我,在"当前用户"位于ForeignKey中的字段中,无法创建模型并限制选择。
我将尝试通过一个示例对此进行解释:

class Project(models.Model):
  name = models.CharField(max_length=100)
  employees = models.ManyToManyField(Profile, limit_choices_to={'active': '1'})

class TimeWorked(models.Model):
  project = models.ForeignKey(Project, limit_choices_to={'user': user})
  hours = models.PositiveIntegerField()

当然,该代码不起作用,因为没有"用户"对象,但这是我的想法,我试图将对象"用户"发送到模型中,以限制当前用户拥有项目的选择,我不知道。不想看到我不在的项目。

如果我们能帮助我或者给我任何建议,我非常感谢,我不想我们编写所有应用程序,而只是提示如何处理该应用程序。我脑子里有两天了,我想不通:(

更新:解决方案在这里:http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/将" request.user"发送到模型。

解决方案

嗯,我不完全理解你的问题。但是,如果在声明模型时无法做到这一点,也许可以通过"发送"用户对象的对象类的重写方法来实现相同的目的,也许可以从构造函数开始。

模型本身对当前用户一无所知,但是我们可以在操作模型对象的表单中给该用户(并在表单中为需要的字段重置" choices"中选择)。

如果我们需要在管理网站上使用它,可以尝试将raw_id_admin与django-granular-permissions一起使用(http://code.google.com/p/django-granular-permissions/,但我无法迅速使其正常运行在我的django上,但它似乎足够新鲜了,所以1.0 ...)。

最后,如果我们在admin中非常需要一个选择框,则需要破解django.contrib.admin本身。

我不确定我是否完全了解我们想做什么,但是我认为我们很有可能会使用自定义管理器至少部分地了解我们要做什么。特别是,不要试图通过对当前用户的限制来定义模型,而要创建一个仅返回与当前用户匹配的对象的管理器。

如果要获取当前用户来编辑此模型,请使用threadlocals。 Threadlocals中间件将当前用户置于进程范围的变量中。拿这个中间件

from threading import local

_thread_locals = local()
def get_current_user():
    return getattr(getattr(_thread_locals, 'user', None),'id',None)

class ThreadLocals(object):
    """Middleware that gets various objects from the
    request object and saves them in thread local storage."""
    def process_request(self, request):
        _thread_locals.user = getattr(request, 'user', None)

查看有关如何使用中间件类的文档。然后,我们可以在代码中的任何地方调用

user = threadlocals.get_current_user

这是CookBook Threadlocals和用户