2011-02-03 24 views
12

मैं अपने कुछ Django वैश्विक सेटिंग्स को व्यवस्थापक इंटरफ़ेस के माध्यम से कॉन्फ़िगर करने योग्य बनाना चाहता हूं।Django मॉडल: केवल मॉडल में एक प्रविष्टि की अनुमति दें?

इसके लिए मैं उन्हें डेटाबेस फ़ील्ड, बल्कि settings.py की तुलना के रूप में स्थापित करने का निर्णय लिया।

class ManagementEmail(models.Model): 
    librarian_email = models.EmailField() 
    intro_text = models.CharField(max_length=1000) 
    signoff_text = models.CharField(max_length=1000) 

ये एक बंद वैश्विक सेटिंग्स हैं, तो मैं ही कभी वहाँ चाहते हैं एक भी librarian_email, intro_text आदि प्रणाली के आसपास चल होने के लिए:

ये सेटिंग्स मैं के बारे में परवाह नहीं है।

क्या कोई तरीका है कि मैं व्यवस्थापक उपयोगकर्ताओं को मौजूदा रिकॉर्ड संपादित करने से रोकने के बिना पर नए रिकॉर्ड जोड़ने से रोक सकता हूं?

मुझे लगता है मैं इस मॉडल के लिए एक कस्टम व्यवस्थापक टेम्पलेट लिख कर ऐसा कर सकते हैं, लेकिन मैं वहाँ अगर यह कॉन्फ़िगर करने के लिए एक neater तरीका जानना चाहते हैं।

मैं उदाहरण के लिए class के अलावा कुछ का इस्तेमाल कर सकता?

धन्यवाद!

उत्तर

14

कृपया this question on "keep[ing] settings in database", जहां जवाब होने की django-dbsettings

अद्यतन

बस एक और विकल्प के बारे में सोचा लगता देखें: आप निम्नलिखित मॉडल बना सकते हैं:

from django.contrib.sites.models import Site 

class ManagementEmail(models.Model): 
    site = models.OneToOneField(Site) 
    librarian_email = models.EmailField() 
    intro_text = models.CharField(max_length=1000) 
    signoff_text = models.CharField(max_length=1000) 
क्योंकि OneToOneField क्षेत्र की

, आप प्रति साइट केवल एक प्रबंधन ईमेल रिकॉर्ड कर सकते हैं। फिर, बस सुनिश्चित करें कि आप साइटों का उपयोग कर रहे हैं और फिर आप सेटिंग्स thusly खींच सकते हैं:

from django.contrib.sites.models import Site 
managementemail = Site.objects.get_current().managementemail 

ध्यान दें कि क्या अन्य सभी लोग आपसे कह रहा है सही है; यदि आपका लक्ष्य सेटिंग्स को स्टोर करना है, तो उन्हें मॉडल में फ़ील्ड के रूप में एक-एक करके जोड़ना सबसे अच्छा कार्यान्वयन नहीं है। समय के साथ सेटिंग जोड़ना सिरदर्द होने वाला है: आपको अपने मॉडल में फ़ील्ड जोड़ना होगा, डेटाबेस संरचना अपडेट करना होगा, और उस सेटिंग को कॉल करने वाले कोड को संशोधित करना होगा।

यही कारण है कि मैं ऊपर वर्णित django ऐप का उपयोग करने की सलाह दूंगा, क्योंकि यह वही करता है जो आप चाहते हैं - उपयोगकर्ता संपादन योग्य सेटिंग्स प्रदान करें - बिना किसी अतिरिक्त, अनावश्यक काम किए।

+0

धन्यवाद। मैं डेवलपर से टिप्पणी देने के बाद, django-dbsettings से थोड़ा सावधान हूं: http://www.chicagodjango.com/blog/django-settings-database/ – AP257

+0

django-dbsettings के बारे में उनकी शिकायतों की तरह लगता है आपके मामले में। आप कोड में सभी सेटिंग्स को परिभाषित कर रहे हैं। मैं निश्चित रूप से इसे संभालने के लिए अपने स्वयं के सिंगलटन लिखने के खिलाफ सिफारिश करता हूं। –

+0

यह देव से टिप्पणी है कि वह अब इसे चिंतित नहीं कर रहा है जो मुझे चिंतित करता है। दरअसल, जब मैंने इसे स्थापित करने का प्रयास किया, तो मुझे 'न्यूफॉर्म' के बारे में त्रुटियां मिलनी शुरू हुईं, यह सुझाव दे रहा है कि यह बहुत पुराना है ... आपके वैकल्पिक सुझाव का प्रयास करेंगे, धन्यवाद! – AP257

2

बस एक GlobalSettings ऐप्लिकेशन या किसी कुंजी और मान फ़ील्ड के साथ कुछ की स्थापना की।

आप उन्हें आसानी से GlobalSettings एप्लिकेशन संपादित करने की अनुमति नहीं देकर मूल्यों को बदलने से व्यवस्थापक उपयोगकर्ताओं रोक सकता है।

class GlobalSettingsManager(models.Manager): 
     def get_setting(self, key): 
      try: 
       setting = GlobalSettings.objects.get(key=key) 
      except: 
       raise MyExceptionOrWhatever 
      return setting 

class GlobalSettings(models.Model): 
     key = models.CharField(unique=True, max_length=255) 
     value = models.CharField(max_length=255) 

     objects = GlobalSettingsManager() 

>>> APP_SETTING = GlobalSettings.objects.get_setting('APP_SETTING') 

इसके लिए ऐप्स हैं लेकिन मैं उन्हें देखना और खुद लिखना पसंद करता हूं।

+0

हां, मैं ऐप की बजाय डीबी में कुछ भी पसंद करूंगा। हालांकि: जैसा कि प्रश्न में बताया गया है, व्यवस्थापक उपयोगकर्ता * मौजूदा फ़ील्ड को संपादित करने में सक्षम होना चाहिए - बस नए आइटम जोड़ने में सक्षम नहीं है। कोई विचार? – AP257

2

मैं वर्डप्रेस के बाहर एक पेज काफ़ी होगा और एक मॉडल बनाने वह समर्थन सेटिंग्स।

class Settings(model.models): 
option_name = models.charfield(max_length = 1000) 
option_value = models.charfield(max_length = 25000) 
option_meta = models.charfield(max_length = 1000) 

तब आप केवल खेतों में अचार (धारावाहिक) वस्तुओं को चुन सकते हैं और आप ठोस होंगे।

थोड़ा एपीआई बनाएं, और आप वर्डप्रेस और कॉल के रूप में चालाक हो सकते हैं। AdminOptions.get_option(opt_name)

फिर आप रनटाइम में कस्टम सेटिंग्स को लोड कर सकते हैं, settings.py मॉड्यूल को अलग रखते हुए, लेकिन बराबर। इसे लिखने के लिए एक अच्छी जगह __init__.py फ़ाइल में होगी।

9

मुझे लगता है कि सबसे आसान तरीका है आप यह कर सकते हैं ModelAdmin की has_add_permissions समारोह उपयोग कर रहा है:

class ContactUsAdmin(admin.ModelAdmin): 
    form = ContactUsForm 

    def has_add_permission(self, request): 
     return False if self.model.objects.count() > 0 else super().has_add_permission(request) 

आप सेट के ऊपर किसी भी नंबर पर आप चाहते हो सकता है, django docs देखते हैं।

यदि आपको उससे अधिक ग्रॅन्युलरिटी की आवश्यकता है, और मॉडल स्तर पर कक्षा को सिंगलटन बनाएं, तो django-solo देखें। कई सिंगलटन कार्यान्वयन भी हैं जो मैं पार आया।

StackedInline के लिए, आप को हटाने को रोकने के लिए MAX_NUM = 1.

+1

मुझे लगता है कि अगर रिटर्न गलत है तो self.model.objects.count()> 0 अन्य सुपर()। Has_add_permission (अनुरोध) 'अनुमति प्रबंधन नियमों के संबंध में बेहतर होगा। –

+0

कोई त्रुटि है अगर आप एक प्रविष्टि को हटाने, इस काम करता है बेहतर 'अगर self.model.objects.count()> 0: \t \t \t वापसी झूठी \t बाकी \t: \t \t \t वापसी TRUE' – paul100

+0

यह तो 0 देता है, यह 'super()। has_add_permission (अनुरोध) 'का मूल्यांकन करेगा और यदि कोई अनुमति नहीं है, तो त्रुटि लौटाएं, जो सही लगता है। – radtek

0

@radtek जवाब के संशोधन का उपयोग करता है, तो केवल एक प्रविष्टि छोड़ दिया है

class SendgridEmailQuotaAdmin(admin.ModelAdmin): 
    list_display = ('quota','used') 
    def has_add_permission(self, request): 
     return False if self.model.objects.count() > 0 else True 
    def has_delete_permission(self, request, obj=None): 
     return False if self.model.objects.count() <= 1 else True 
    def get_actions(self, request): 
     actions = super(SendgridEmailQuotaAdmin, self).get_actions(request) 
     if(self.model.objects.count() <= 1): 
      del actions['delete_selected'] 
     return actions 
0

मैं मूल रूप से एक ही समस्या थी के रूप में मूल रूप से पोस्ट का वर्णन करता है, और यह आसानी modelAdmin कक्षाएं अधिभावी द्वारा निश्चित होती है। एक admin.py फ़ाइल में इस के समान कुछ आसानी से एक नई वस्तु को जोड़ने से बचाता है लेकिन मौजूदा एक संपादन की अनुमति देता:

class TitleAdmin(admin.ModelAdmin): 
def has_delete_permission(self, request, obj=TestModel.title): 
    return False 

def has_add_permission(self, request): 
    return False 

def has_change_permission(self, request, obj=TestModel.title): 
    return True 

यह एक रूप है कि डेटा संपादन पोस्ट से एक उपयोगकर्ता को नहीं रोकता है, लेकिन ऐसा होने से चीजों को रखता है व्यवस्थापक साइट में। इस पर निर्भर करता है कि आपको अपनी जरूरतों के लिए जरूरी है या नहीं, आप कम से कम कोडिंग के साथ रिकॉर्ड को हटाने और जोड़ने में सक्षम हो सकते हैं।

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