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

Abe*_*ada 12 python django model

我去了所有的文档,我也去了IRC频道(BTW一个伟大的社区),他们告诉我,在"当前用户"在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()
Run Code Online (Sandbox Code Playgroud)

当然这段代码不起作用,因为没有'用户'对象,但这是我的想法,我试图将对象'用户'发送到模型,只是限制当前用户有项目的选择,我不我不想看到我不在的项目.

非常感谢你,如果你可以帮助我或给我任何建议,我不想你写所有的应用程序,只是一个提示如何处理.我有2天的时间在脑海中,我无法弄清楚:(

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

Ane*_*pic 6

这种对当前用户的选择限制是一种需要在请求周期中动态发生的验证,而不是在静态模型定义中。

换句话说:在您创建此模型的实例时,您将处于视图中,此时您将可以访问当前用户并可以限制选择。

然后你只需要一个自定义的 ModelForm 将 request.user 传递给,请参阅此处的示例:http ://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/

from datetime import datetime, timedelta
from django import forms
from mysite.models import Project, TimeWorked

class TimeWorkedForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(ProjectForm, self).__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(user=user)

    class Meta:
        model = TimeWorked
Run Code Online (Sandbox Code Playgroud)

那么在你看来:

def time_worked(request):
    form = TimeWorkedForm(request.user, request.POST or None)
    if form.is_valid():
        obj = form.save()
        # redirect somewhere
    return render_to_response('time_worked.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)


Dmi*_*nko -5

如果您想获取编辑此模型的当前用户,请使用 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)
Run Code Online (Sandbox Code Playgroud)

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

user = threadlocals.get_current_user
Run Code Online (Sandbox Code Playgroud)

  • 这是一个坏主意...您必须使用 threadlocals 进行黑客攻击的原因是因为此验证*不应该在模型中* (6认同)
  • 同意。两年前,这似乎是一个不错的主意 (2认同)