2012-05-30 7 views
5

कृपया इसे एक प्रश्न के रूप में देखें। शायद कोई नीचे समाधानों में से एक का उपयोग करेगा।डीजेंगो उपयोगकर्ता छिपी हुई इनपुट बनाम कक्षा आधारित दृश्यों के साथ सीधे विचारों में बचत

मेरे पास कुछ मॉडल हैं जिनमें ForeignKey(User) फ़ील्ड है। मेरी कक्षा-आधारित दृश्य दृश्य जेनेरिक CreateView से प्राप्त किए गए हैं।

वहाँ जब एक नई वस्तु को जोड़ने जुड़े उपयोगकर्ता को बचाने के लिए दो विकल्प हैं:

  1. सहेजा जा रहा है form_valid विधि अधिभावी द्वारा विचारों में रूप; इस user_id बेनकाब नहीं करता है (और अन्य यहाँ कि उजागर नहीं किया जाना चाहिए डेटा का उल्लेख नहीं)

    class CreateOfferView(CreateView): 
    
        model = Offer 
        form_class = SomeModelFormWithUserFieldExcluded 
    
        def form_valid(self, form): 
         instance = form.save(commit=False) 
         instance.user = self.request.user 
         instance.save() 
    
  2. सहेजा जा रहा है एक छिपी हुई फ़ील्ड में उपयोगकर्ता आईडी संग्रहीत (और उजागर) के साथ प्रपत्र। यहां मुश्किल हिस्सा है। उपयोगकर्ता फ़ील्ड के साथ और अधिक मॉडल हैं ... इसलिए कोई फ़ॉर्म बनाते समय मुझे उपयोगकर्ता फ़ील्ड को प्रारंभिक (वर्तमान में लॉग इन) उपयोगकर्ता भरने की आवश्यकता है और मुझे उस फ़ील्ड को छिपाने की भी आवश्यकता है। इस प्रयोजन के लिए मैं का उपयोग किया है मेरी OwnFormMixin

    class OwnFormMixin(object): 
    
        def get_form(self, form_class): 
         form = super(OwnFormMixin, self).get_form(form_class) 
         form.fields['user'].widget = forms.HiddenInput() 
    
        def get_initial(self): 
         initial = super(OwnFormMixin, self).get_initial() 
         initial['user'] = self.request.user.pk 
         #I could also do this in get_form() with form.fields['user'].initial 
    
    class CreateOfferView(OwnFormMixin, CreateView): 
        model = Offer 
        form_class = SomeModelFormWithAllFields 
    

रहे हैं और अधिक CreateXXXView का उपयोग कर OwnFormMixin ..

कैसे आप रूपों में अपने उपयोगकर्ता डेटा सहेज सकता हूँ?

छिपे बनाम सीधे आपके विचारों में बचत? पेशेवर/विपक्ष क्या हैं?

+0

आप सत्यापन पर request.user का उपयोग क्यों नहीं करते? क्या किसी अन्य उपयोगकर्ता से पोस्ट का जवाब देने की संभावना है? Django उपयोगकर्ता डेटा से किसी भी रूप में किसी भी रूप में या किसी भी दृश्य भाग में किसी भी संपर्क का खुलासा क्यों न करें। यह एक संभावित भेद्यता है ... – garmoncheg

उत्तर

2

जब तक आप करने के लिए उपयोगकर्ताओं कि ForeignKeyField संशोधित अनुमति दे रहे हैं, वहाँ कोई कारण नहीं है एक रूप में शामिल करने की - मैं exclude का उपयोग कर अपने ModelForm से बाहर उपयोगकर्ता क्षेत्र रखने के लिए के अपने पहले समाधान, और सेटिंग के साथ जाना चाहते हैं request.user से उपयोगकर्ता। वास्तव में, Django documentation now has an example along these exact lines

आप user_id पैरामीटर के हेरफेर के खिलाफ सुरक्षित करने के लिए, अपने आंतरिक प्रयोक्ता आईडी नहीं उजागर नहीं होने और विभिन्न बारे में चिंता करने बनाम अद्यतन मामलों बनाएं न होने का लाभ मिलता है। मामूली नुकसान यह है कि यदि आपको किसी ऑब्जेक्ट के संबंधित User को बदलने की क्षमता की आवश्यकता है तो आपको फिर से शुरू करने की आवश्यकता होगी।

संबंधित मुद्दे