복붙노트

[PYTHON] 모델 limit_choices_to = { 'user': 사용자}

PYTHON

모델 limit_choices_to = { 'user': 사용자}

나는 모든 문서를 보냈고 또한 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()

물론 '사용자'객체가 없기 때문에 코드가 작동하지 않습니다.하지만 그건 내 생각이었고 모델에 'user'객체를 보내서 현재 사용자에게 프로젝트가있는 선택을 제한하려고했습니다. 내가 있지 않은 곳의 프로젝트를보고 싶지 않습니다.

도와 주시거나 조언을 해 주시면 대단히 감사합니다. 모든 앱을 작성하고 싶지는 않지만 그 문제를 해결하는 방법을 알려주세요. 나는 내 머리 속에서 이걸 가지고 2 일을 보냈고 알아 내지 못한다. (

업데이트 : 솔루션은 http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/입니다. request.user를 모델로 보냅니다.

해결법

  1. ==============================

    1.이 모델을 편집하는 현재 사용자를 얻으려면 threadlocals를 사용하십시오. Threadlocals 미들웨어는 현재 사용자를 프로세스 차원의 변수로 변환합니다. 이 미들웨어 가져 가라.

    이 모델을 편집하는 현재 사용자를 얻으려면 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
    
  2. ==============================

    2.모델 자체는 현재 사용자에 대해서는 알지 못하지만 모델 객체를 운영하는 양식으로 (그리고 필요한 필드에 대한 양식 재설정 선택시)이 사용자에게보기를 제공 할 수 있습니다.

    모델 자체는 현재 사용자에 대해서는 알지 못하지만 모델 객체를 운영하는 양식으로 (그리고 필요한 필드에 대한 양식 재설정 선택시)이 사용자에게보기를 제공 할 수 있습니다.

    관리 사이트에서 필요하다면 django-granular-permissions (http://code.google.com/p/django-granular-permissions/)와 함께 raw_id_admin을 시도해 볼 수는 있지만 장고 하지만 1.0 정도면 충분히 신선 해 보입니다 ...).

    마침내 admin에서 선택 상자가 많이 필요할 경우 django.contrib.admin 자체를 해킹해야합니다.

  3. ==============================

    3.여기 CookBook Threadlocals 및 사용자가 있습니다.

    여기 CookBook Threadlocals 및 사용자가 있습니다.

  4. ==============================

    4.이러한 현재 사용자의 선택을 제한하는 것은 정적 모델 정의가 아닌 요청주기에서 동적으로 발생해야하는 일종의 유효성 검사입니다.

    이러한 현재 사용자의 선택을 제한하는 것은 정적 모델 정의가 아닌 요청주기에서 동적으로 발생해야하는 일종의 유효성 검사입니다.

    다른 말로하면,이 모델의 인스턴스를 생성하는 시점에서 당신은 뷰에있을 것이고, 그 시점에서 현재 사용자에게 액세스 할 수 있고 선택을 제한 할 수 있습니다.

    그런 다음 request.user를 전달할 사용자 정의 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})
    
  5. ==============================

    5.나는 당신이하고 싶은 것을 정확히 이해하고 있는지 확신 할 수는 없지만, 커스텀 매니저를 사용하여 적어도 부분적으로는 얻을 수있는 좋은 기회라고 생각합니다. 특히, 현재 사용자에 대한 제한 사항으로 모델을 정의하지 말고 현재 사용자와 일치하는 오브젝트 만 리턴하는 관리자를 작성하십시오.

    나는 당신이하고 싶은 것을 정확히 이해하고 있는지 확신 할 수는 없지만, 커스텀 매니저를 사용하여 적어도 부분적으로는 얻을 수있는 좋은 기회라고 생각합니다. 특히, 현재 사용자에 대한 제한 사항으로 모델을 정의하지 말고 현재 사용자와 일치하는 오브젝트 만 리턴하는 관리자를 작성하십시오.

  6. ==============================

    6.흠, 나는 당신의 질문을 완전히 이해하지 못합니다. 그러나 모델을 선언 할 때 할 수 없다면 사용자 객체를 "보내"는 객체 클래스의 메소드를 오버라이드하여 같은 것을 얻을 수 있습니다. 아마도 생성자로 시작할 것입니다.

    흠, 나는 당신의 질문을 완전히 이해하지 못합니다. 그러나 모델을 선언 할 때 할 수 없다면 사용자 객체를 "보내"는 객체 클래스의 메소드를 오버라이드하여 같은 것을 얻을 수 있습니다. 아마도 생성자로 시작할 것입니다.

  7. from https://stackoverflow.com/questions/160009/model-limit-choices-to-user-user by cc-by-sa and MIT license