2008-10-01 17 views
10

मैं सभी दस्तावेज में गया, मैं भी आईआरसी चैनल (बीटीडब्ल्यू एक महान समुदाय) गया और उन्होंने मुझे बताया कि मॉडल बनाने और विकल्पों को सीमित करने के लिए संभव नहीं है क्षेत्र जहां 'वर्तमान उपयोगकर्ता' विदेशीकी में है। मैं एक उदाहरण के साथ यह समझाने की कोशिश करेंगे:मॉडल सीमा_choices_to = {'उपयोगकर्ता': उपयोगकर्ता}

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 दिन है और मैं यह समझ नहीं :(

अद्यतन: समाधान यहाँ है:। http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/ एक मॉडल के लिए request.user भेजने

उत्तर

1

यदि आप वर्तमान प्राप्त करना चाहते हैं तो इस मॉडल को संपादित करने वाले थ्रेडलोकल्स का उपयोग करें। थ्रेडलोकल्स मिडलवेयर वर्तमान उपयोगकर्ता को प्रक्रिया-व्यापी चर में डालता है। इस मिडलवेयर

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

+5

यह एक बुरा विचार है ... थ्रेडलोकल्स के साथ आपको हैक करने का कारण यह है क्योंकि यह सत्यापन * मॉडल * – Anentropic

+1

सहमत नहीं होना चाहिए। दो साल पहले यह एक अच्छा विचार की तरह लग रहा था –

-1

हममम, मैं पूरी तरह से नहीं है अपने प्रश्न को समझें। लेकिन अगर आप मॉडल को घोषित करते समय ऐसा नहीं कर सकते हैं तो आप ऑब्जेक्ट्स के वर्ग के ओवरराइडिंग विधियों के साथ एक ही चीज़ प्राप्त कर सकते हैं जहां आप उपयोगकर्ता ऑब्जेक्ट भेजते हैं, शायद कन्स्ट्रक्टर के साथ शुरू हो सकते हैं।

+0

उदाहरण के लिए, मैं 10 परियोजनाओं है, लेकिन मैं सिर्फ 3 में हूँ मैं एक लटकती प्राप्त करना चाहते हैं बॉक्स में केवल 3 परियोजनाओं के साथ बॉक्स में, मैं सभी 10 परियोजनाओं को नहीं दिखाना चाहता हूं। – AbeEstrada

4

मॉडल को वर्तमान उपयोगकर्ता के बारे में कुछ भी पता नहीं है लेकिन आप इस उपयोगकर्ता को उस मॉडल के रूप में देख सकते हैं जो मॉडल ऑब्जेक्ट्स संचालित करता है (और फॉर्म रीसेटआवश्यक फ़ील्ड के लिए)।

आप व्यवस्थापक साइट पर इस की जरूरत है - आप django-granular-permissions के साथ raw_id_admin कोशिश कर सकते हैं (http://code.google.com/p/django-granular-permissions/ लेकिन मैं तेजी से यह मेरे Django पर काम नहीं मिल सका, लेकिन यह 1.0 तो ... के लिए पर्याप्त ताजा हो रहा है)।

आखिरकार, यदि आपको व्यवस्थापक में एक चयन बॉक्स की आवश्यकता है - तो आपको django.contrib.admin स्वयं ही हैक करना होगा।

0

मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि आप क्या करना चाहते हैं, लेकिन मुझे लगता है कि एक अच्छा मौका है कि आपको कम से कम custom Manager का उपयोग करने का तरीका मिलेगा। विशेष रूप से, वर्तमान मॉडल को प्रतिबंधों के साथ अपने मॉडल को परिभाषित करने का प्रयास न करें, लेकिन एक प्रबंधक बनाएं जो केवल वर्तमान उपयोगकर्ता से मेल खाने वाली ऑब्जेक्ट लौटाता है।

1

वर्तमान उपयोगकर्ता के लिए विकल्पों की यह सीमित है मान्यता का एक प्रकार अनुरोध चक्र में गतिशील होने की जरूरत है, स्थिर मॉडल परिभाषा में नहीं है ।

दूसरे शब्दों में: उस बिंदु पर जहां आप इस मॉडल के उदाहरण बना रहे हैं, तो आप एक दृश्य में होंगे और उस समय आपको वर्तमान उपयोगकर्ता तक पहुंच होगी और विकल्पों को सीमित कर सकते हैं।

फिर अनुरोध में पास करने के लिए आपको केवल एक कस्टम मॉडलफॉर्म की आवश्यकता है।उपयोगकर्ता के लिए, उदाहरण के यहाँ देखें: 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}) 
संबंधित मुद्दे