2012-12-18 19 views
21

मैं एक Django मॉडल है जो एक रूप इनपुट से उपयोगकर्ता और उत्पाद डेटा संग्रहीत करता है:Django भंडारण अनाम उपयोगकर्ता डेटा

def ProductSelection(request, template_name='product_selection.html'): 
    ... 
    if user.is_authenticated(): 
     user = request.user 
    else: 
     # deal with anonymous user info 
    project = Project.objects.create(
     user=user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"], 
    ) 

बेशक इस प्रमाणीकृत उपयोगकर्ताओं के लिए ठीक है, लेकिन मैं यह भी गुमनाम स्टोर करने के लिए सक्षम होना चाहते हैं उपयोगकर्ता प्रोजेक्ट, और यदि संभव हो, तो अंततः पंजीकरण और प्रमाणीकरण करते समय उन्हें उपयोगकर्ता के साथ संबद्ध करें।

मेरा विचार अनाम उपयोगकर्ता को नाम = some_variable (एक यादृच्छिक हैश के साथ समेकित टाइमस्टैम्प?) के साथ बनाना है, फिर उस उपयोगकर्ता नाम को सत्र डेटा में सहेजें। यदि मैं सुनिश्चित करता हूं कि उस सत्र चर, यदि मौजूद है, तो उस उपयोगकर्ता की सभी परियोजनाओं की गतिविधि को रिकॉर्ड करने के लिए उपयोग किया जाता है, तो मैं पंजीकरण करते समय उपयोगकर्ता के वास्तविक प्रमाण-पत्रों के साथ परियोजनाओं को अपडेट करने में सक्षम होना चाहिए।

क्या यह अत्यधिक जटिल और भंगुर है? क्या मुझे अनावश्यक रूप से डेटा की हजारों पंक्तियों को बचाने का जोखिम है? इस आम मुद्दे के लिए इष्टतम दृष्टिकोण क्या होगा?

इस पर कोई मार्गदर्शन बहुत सराहना की जाएगी।

उत्तर

16

आप अज्ञात उपयोगकर्ता डेटा स्टोर करने के लिए Django's session framework का उपयोग कर सकते हैं।

फिर आप या तो अपने Project मॉडल के लिए एक क्षेत्र में जोड़ सकते हैं अनाम उपयोगकर्ताओं के लिए session_key मूल्य धारण करने के लिए,

project = Project.objects.create(
    user=request.user, # can be anonymous user 
    session=request.session.session_key, 
    product=form.cleaned_data["product"], 
    quantity=form.cleaned_data["product_quantity"]) 

या बस सभी डेटा एक परियोजना उदाहरण सत्र में होता स्टोर

if user.is_authenticated(): 
    project = Project.objects.create(
     user=request.user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"]) 
else: 
    # deal with anonymous user info 
    request.session['project'] = { 
     "product": form.cleaned_data["product"], 
     "quantity": form.cleaned_Data["product_quantity"]} 

उचित उपयोगकर्ता बनाते समय आप बाद में सत्र से डेटा पुनर्प्राप्त कर सकते हैं।

+0

जब मैं अतीत में इसी तरह के मुद्दों में भाग गया, तो समस्या तब आती है जब आपको दूसरी दिशा में वापस जाने की आवश्यकता होती है। जैसे कि उपयोगकर्ताओं के पास कई परियोजनाएं हो सकती हैं, और आपको कुछ ऐसा करने की ज़रूरत है जैसे कि कौन से सत्र दो विशिष्ट परियोजनाओं को पसंद करते हैं। – JeffS

+0

मेरे मामले में, मैं दोनों को अज्ञात उपयोगकर्ता डेटा को डीबी में संग्रहीत करना चाहता हूं और सत्रों के माध्यम से इसे एक विशिष्ट उपयोगकर्ता के साथ जोड़ना चाहता हूं। यदि 'user = request.user' अज्ञात उपयोगकर्ता ऑब्जेक्ट देता है, तो मैं पंजीकरण के बाद उपयोगकर्ता को यह जानकारी बाद में नहीं जोड़ सकता। –

+1

उस स्थिति में, मेरा पहला उदाहरण यह करना चाहिए: 'session_key' मान को पकड़ने के लिए एक फ़ील्ड जोड़ें और बाद में आप वांछित प्रोजेक्ट इंस्टेंस को पुनर्प्राप्त कर सकते हैं और अज्ञात उपयोगकर्ता अज्ञात होने पर इसे नए उपयोगकर्ता से जोड़ सकते हैं :-) –

7

बस स्पष्ट करने के लिए नीचे दिए गए कोड कैसे मेरे मामले में समाधान लागू है:

 project = Project.objects.create(
      session=request.session.session_key, 
      # save all other fields 
      ... 
     ) 
     if request.user.is_authenticated(): 
      project.user = request.user 
     else: 
      # make a copy of the session key 
      # this is done because the session_key changes 
      # on login/ register 
      request.session['key_copy'] = request.session.session_key 
     project.save() 

और मेरे models.py में:

class Project(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 

इसलिए, यदि उपयोगकर्ता फ़ील्ड रिक्त हो सकता है, और इस मामले में हम चीजों का ट्रैक रखने के लिए session_key का उपयोग करते हैं।