2008-10-01 3 views
10

Я пошел ко всей документации, также я пошел на канал IRC (BTW большое сообщество), и они сказали мне, что невозможно создать модель и ограничить выбор в где «текущий пользователь» находится в ForeignKey. Я попытаюсь объяснить это на примере:Model limit_choices_to = {'user': user}

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() 

Конечно этот код не работает, потому что нет «пользователь» объект, но это была моя идея, и я пытался отправить объект «пользователь 'к модели, чтобы просто ограничить выбор, где у текущего пользователя есть проекты, я не хочу видеть проекты, в которых меня нет.

Большое спасибо, если вы можете мне помочь или дать мне какие-либо советы, Я не хочу, чтобы вы пишете все приложение, просто подскажите, как с этим бороться. У меня есть 2 дня с этим в моей голове, и я не могу понять :(

UPDATE: Решение здесь:. http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/ отправка request.user к модели

ответ

1

Используйте 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 
+0

Я собираюсь попробовать это. – AbeEstrada 2008-10-02 13:48:55

-1

Ммм, я не в полной мере понять ваш вопрос, но если вы не можете это сделать, когда объявляете модель, возможно, вы можете добиться того же самого с помощью переопределяющих методов класса объектов, в которых вы «отправляете» объект пользователя, возможно, начинайте с конструктора.

+0

К примеру, у меня есть 10 проектов, но я просто в 3. Я хочу, чтобы получить выпадающий список коробка с только тремя проектами, в которых я нахожусь, я не хочу показывать все 10 проектов. – AbeEstrada 2008-10-01 22:27:50

4

Сама модель сама ничего не знает о текущем пользователе, но вы можете дать этому пользователю доступ к форме, которая управляет объектами моделей (и в форме сброса choices для необходимого поля).

Если вам это нужно на сайте администратора - вы можете попробовать raw_id_admin вместе с django-granular-permissions (http://code.google.com/p/django-granular-permissions/, но я не мог быстро получить работу на моем Джанго, но это, кажется, достаточно свежим 1,0 так ...).

Наконец-то, если вам тяжело нужен selectbox в админ - тогда вам нужно взломать django.contrib.admin.

0

Я не уверен, что полностью понимаю, что вы хотите сделать, но я думаю, что есть хороший шанс, что вы получите хотя бы часть пути, используя custom Manager. В частности, не пытайтесь определить свои модели с ограничениями для текущего пользователя, но создайте менеджера, который возвращает объекты, соответствующие текущему пользователю.

1

Это ограничение выбора для текущего пользователя является своего рода проверки, что должно произойти динамически в цикле запроса, а не в статическом определении модели ,

Другими словами: в точке, где вы создаете экземпляр модели этой модели, вы будете находиться в режиме просмотра и в этот момент у вас будет доступ к текущему пользователю и может ограничить выбор.

Для этого вам потребуется только специальная модель ModelForm.пользователю, посмотреть пример здесь: 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 

затем на ваш взгляд:

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})