django

2009-03-12 3 views
10

में जेनेरिक create_object व्यू के साथ ऑब्जेक्ट स्वामी को सेट करना क्या नया ऑब्जेक्ट बनाने के लिए create_object व्यू का उपयोग करना संभव है और स्वचालित रूप से request.user को विदेशी कुंजी के रूप में असाइन करना संभव है?django

P.E:

class Post(models.Model): 
    text = models.TextField() 
    author = models.ForeignKey(User) 

क्या मैं चाहता हूँ create_object का उपयोग करें और request.user साथ लेखक को भरने के लिए है।

उत्तर

2

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

from django.views.generic.create_update import get_model_and_form_class 
def form_user_default(request): 
    if request.method == 'GET': 
     model, custom_form = get_model_and_form_class(Post,None) 
     custom_form.author = request.user 
     return {'form':custom_form} 
    else: return {} 

क्या यह कर देगा प्रपत्र उद्देश्य यह है कि create_update टेम्पलेट से गुजरता ओवरराइड है:

एक संदर्भ प्रोसेसर लिखें। डिफ़ॉल्ट रूप से यह करने के बाद यह तकनीकी रूप से क्या कर रहा है यह फ़ॉर्म फिर से बना रहा है।

आपके url conf में

तब:

url(r'pattern_to_match', 'django.views.generic.create_update.create_object', kwargs={'context_processors':form_user_default}) 

फिर से, मैं स्रोत कोड में तल्लीन करने के ऐसा करने के तरीके जानने के लिए किया था। यह वास्तव में अपने स्वयं के विचार लिखने का प्रयास करना सबसे अच्छा हो सकता है (लेकिन जितना संभव हो उतने Django कस्टम ऑब्जेक्ट्स को शामिल करें)। ऐसा करने के लिए कोई "सरल डिफ़ॉल्ट" तरीका नहीं है, क्योंकि django प्रतिमान रूपों में मॉडल परत से अधिक निकटता से जुड़े होते हैं, और केवल विचारों को अनुरोध ऑब्जेक्ट का ज्ञान होता है।

1

यदि कोई उपयोगकर्ता प्रमाणीकृत है, तो उनकी उपयोगकर्ता वस्तु request.user ऑब्जेक्ट है।

मैं create_object से परिचित नहीं हूं ... मैं अभी भी django के लिए शुरुआत कर रहा हूं और केवल इसके साथ ही अपनी पहली असली परियोजना शुरू कर दी है।

ध्यान दें कि आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि उपयोगकर्ता इसका उपयोग करने से पहले लॉग इन है। यह request.user.is_authenticated() के साथ किया जा सकता है।

+0

मुझे पता है (वैसे भी धन्यवाद;))। मैं जो करने की कोशिश कर रहा हूं वह इस के लिए एक सामान्य दृश्य का उपयोग करना है, इसलिए मुझे नई वस्तु को सहेजने के लिए कोड लिखना नहीं है। Django कोड का पूरी तरह से परीक्षण किया जाता है, जब भी यह संभव हो, मैं इसे अपने कोड के बजाय उपयोग करना पसंद करता हूं। –

0

वर्तमान Django सामान्य विचारों का उपयोग करते समय किसी ऑब्जेक्ट की बचत में हुक करने का कोई अच्छा तरीका नहीं है। एक बार वे rewritten as classes हैं, तो आप पूरे दृश्य को फिर से लिखने के बिना उचित स्थान पर दृश्य को उपclass करने और हुक करने में सक्षम होंगे।

मैं इस कारण से पहले से ही अपने स्वयं के वर्ग-आधारित सामान्य विचारों का उपयोग करता हूं।

0

मैं create_object के लिए एक आवरण बनाने के लिए, के रूप में इस लेखक दृश्य आपको उपयोगकर्ता की जानकारी का लाभ उठा सकेंगे में सुझाव है http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ सुझाव है। बाद में, उपयोगकर्ता को टेम्पलेट में पास करने के लिए अतिरिक्त_कॉन्क्स्ट का उपयोग करने की आवश्यकता होगी। अंत में टेम्पलेट पर आप उपयोगकर्ता जानकारी के साथ एक छिपे हुए क्षेत्र को जोड़ सकते हैं। मैंने कोशिश नहीं की है, लेकिन मैं काफी समय से इसके बारे में सोच रहा हूं। आशा है कि यह समाधान आपको उपयुक्त बनाता है! ;) चीयर्स!

3

आप एक बंद करने पर विचार करना चाह सकते हैं।

from django.forms import ModelForm 
from django.views.generic.create_update import create_object, update_object 

def make_foo_form(request): 
    class FooForm(ModelForm): 
     class Meta: 
      model = Foo 
      fields = ['foo', 'bar'] 

     def save(self, commit=True): 
      f = super(FooForm, self).save(commit=False) 
      if not f.pk: f.user = request.user 
      if commit: f.save() 
      return f 

    return FooForm 

def create_foo(request): 
    FooForm = make_foo_form(request) 
    return create_object(form_class=FooForm) 

वहाँ के बाद से आप प्रत्येक अनुरोध पर ModelForm वस्तु बनाने के लिए की जरूरत है कुछ अक्षमता यहाँ, है, लेकिन यह आप सामान्य दृश्य में कार्यक्षमता इंजेक्षन करने की अनुमति देता है।

आपको यह तय करने की आवश्यकता है कि फ़ॉर्म निर्माण के लिए अतिरिक्त जटिलता दृश्य पक्ष पर सादगी बनाए रखने के लायक है या नहीं।

def update_foo(request, object_id): 
    FooForm = make_foo_form(request) 
    return update_object(form_class=FooForm, object_id=object_id) 

जाहिर है, आप के रूप में अच्छी अधिक जटिल मामलों के लिए इस दृष्टिकोण का उपयोग कर सकते हैं:

यहाँ एक लाभ, हालांकि, कि यह भी व्यावहारिक रूप से बिना किसी अतिरिक्त प्रयास के साथ अद्यतन मामले के साथ काम करता है।