2012-02-29 20 views
5

क्या कोई तरीका है, आशा है कि व्यवस्थापक को तोड़ने के बिना, ओआरएम स्तर पर मौजूदा मॉडल उदाहरणों को संपादित करने में अक्षम हो?Django - मॉडल संपादन अक्षम करें

मैं टेम्पलेट्स से 'सेव' और 'सेव एंड जारी' बटन को हटाने के बारे में बात नहीं कर रहा हूं - ऐसे कोई ऑपरेशन नहीं हो सकते हैं जो मॉडल के प्रतिबद्ध उदाहरण के मानों को बदल सकें।

अधिमानतः, 'सेव एज़' विकल्प को इसके बजाय काम करना चाहिए। सुपर क्लास

 
class MyModel(models.Model): 

    def save(self, *args, **kwargs): 

     if self.pk is None: 
      super(MyModel, self).save(*args, **kwargs) 

यह फ़ंक्शन केवल फोन समारोह को बचाने (जो वास्तव में परिवर्तन बचाता है) नहीं पी है, उदा वहाँ है यदि:

उत्तर

8

इसलिए की तरह अपने मॉडल के लिए बचाने के समारोह अधिलेखित करें मॉडल उदाहरण नया है।

+3

मुझे इस दृष्टिकोण के बारे में क्या पसंद नहीं है यह है कि सहेजने पर क्लिक करने के बाद भी "संदेश ... सफलतापूर्वक बदल दिया गया था।", कुछ भी नहीं बदला गया था। क्या इस संदेश को "बदलना अक्षम है" में बदलने का कोई तरीका है? या इससे भी बेहतर, उस पंक्ति पर क्लिक अक्षम करने के लिए? – WebOrCode

+3

'MyModel.objects.filter (pk = my_model.pk) को रोकने के लिए कोई तरीका है .update (name = "bob") ' –

4

आप अपने मॉडल वर्ग के सेव() रद्द कर सकते थे (self.pk अगर कुछ भी नहीं) और हटाना (हमेशा कुछ न करें)

लेकिन वास्तव में, डेटाबेस स्तर है कि के लिए सबसे सुरक्षित जगह है। उदाहरण के लिए, PostgreSQL में आप दो सरल नियमों लिख सकते हैं:

CREATE RULE noupd_myapp_mymodel AS ON UPDATE TO myapp_mymodel 
    DO NOTHING; 
CREATE RULE nodel_myapp_mymodel AS ON DELETE TO myapp_mymodel 
    DO NOTHING; 

किसी भी तरह से, व्यवस्थापक इस बारे में कुछ पता नहीं होता, तो सब कुछ अभी भी संपादन योग्य लग रहा है। व्यवस्थापक में केवल मॉडल को पढ़ने के प्रयास के लिए Whole model as read-only पर मेरा उत्तर देखें। अपने उद्देश्यों के लिए, जोड़ने की अनुमति को रखें, और केवल जोड़ते समय केवल पढ़ने के लिए सभी फ़ील्ड घोषित करें।

संपादित करें: आपके मॉडल वर्ग में डिलीट() को ओवरराइड करने का एक कारण सुरक्षित नहीं है, यह तथ्य है कि "थोक हटाएं" (Queryset.delete(), जैसे व्यवस्थापक चेकबॉक्स क्रिया) व्यक्तिगत उदाहरणों को हटाएगी () विधि, यह सीधे एसक्यूएल पर जाएगा: https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

+0

इस उत्तर के लिए धन्यवाद। मैं मॉड्यूल.py पर इन नियमों को पारित करने का तरीका जानने का प्रयास कर रहा हूं। मैंने पाया दस्तावेज का सबसे प्रासंगिक हिस्सा [निष्पादन कस्टम एसक्यूएल सीधे] था (https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql- प्रत्यक्ष रूप से)। क्या आप इस दृष्टिकोण को स्पष्ट करने के लिए एक सरल उदाहरण दे सकते हैं? – raratiru

+1

उपर्युक्त एसक्यूएल स्टेटमेंट्स केवल एक बार आपके द्वारा पसंद किए जाने पर ही निष्पादित किए जाते हैं। एक बार नियम पोस्टग्रेस में है, इसका पालन किया जाएगा। तो आप ऐसा करने के लिए psql का उपयोग कर सकते हैं। यदि आप मॉडल माइग्रेशन के लिए दक्षिण का उपयोग करते हैं, तो मैं नियमों को db.execute() नियमों के लिए एक कस्टम माइग्रेशन की अनुशंसा करता हूं। उदाहरण के लिए उत्तर http://stackoverflow.com/a/5466251/640759 देखें –

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