मेरे पास एक ऐसी परियोजना है जो मैं अभी खत्म कर रहा हूं।
आप एक संपादक और एक पर्यवेक्षक को परिभाषित करने के लिए एक तरह से की जरूरत है: वहाँ बहुत काम इस एक साथ रखा करने के लिए यहाँ हो जाएगा, लेकिन घटक है कि मैं अपने सिस्टम काम करने के लिए किया था से कुछ हैं। यह तीन तरीकों से किया जा सकता है 1.) एक एम 2 एम फ़ील्ड जो पर्यवेक्षक को परिभाषित करता है [और यह मानते हुए कि पढ़ने/लिखने की अनुमति के साथ हर कोई एक संपादक है], 2.) उपयोगकर्ता से प्राप्त होने वाले 2 नए उपयोगकर्ता मॉडल बनाएं [ संभवतः ज़्यादा से ज़्यादा काम] या 3.) उपयोगकर्ता प्रोफाइल को रखने के लिए django.auth क्षमता का उपयोग करें। विधि # 1 शायद सबसे उचित है।
एक बार जब आप पहचान सकते हैं उपयोगकर्ता है कि किस प्रकार, आप एक तरह से सामान्य रूप से प्राधिकरण आप देख रहे हैं लागू करने के लिए की जरूरत है। मुझे लगता है कि यहां सबसे अच्छा मार्ग शायद एक सामान्य व्यवस्थापक मॉडल है।
अन्त में आप "जनक" मॉडल के कुछ प्रकार है कि अनुमतियों जो कुछ के लिए संचालित किए जाने की आवश्यकता का आयोजन करेगा की आवश्यकता होगी। उदाहरण के लिए, यदि आपके पास एक ब्लॉग मॉडल और ब्लॉगपोस्ट मॉडल था (उसी साइट के भीतर कई ब्लॉग मानते हैं), तो ब्लॉग मूल मॉडल है (यह अनुमति देता है कि कौन मंजूरी देता है)। हालांकि, अगर आपके पास एक ब्लॉग है और ब्लॉगपोस्ट के लिए कोई मूल मॉडल नहीं है, तो हमें अनुमतियों को संग्रहीत करने के लिए कुछ जगह चाहिए। मैंने पाया है कि ContentType
यहां अच्छी तरह से काम करता है।
यहाँ कोड (अपरीक्षित और वास्तविक से ज्यादा वैचारिक) में कुछ विचार है।
'मॉडरेटेड' नामक एक नया ऐप बनाएं जो हमारी सामान्य सामग्री को पकड़ लेगा।
moderated.models.py
class ModeratedModelParent(models.Model):
"""Class to govern rules for a given model"""
content_type = models.OneToOneField(ContentType)
can_approve = models.ManyToManyField(User)
class ModeratedModel(models.Model):
"""Class to implement a model that is moderated by a supervisor"""
is_approved = models.BooleanField(default=False)
def get_parent_instance(self):
"""
If the model already has a parent, override to return the parent's type
For example, for a BlogPost model it could return self.parent_blog
"""
# Get self's ContentType then return ModeratedModelParent for that type
self_content_type = ContentType.objects.get_for_model(self)
try:
return ModeratedModelParent.objects.get(content_type=self_content_type)
except:
# Create it if it doesn't already exist...
return ModeratedModelParent.objects.create(content_type=self_content_type).save()
class Meta:
abstract = True
तो अब हम कोड की एक सामान्य, फिर से प्रयोग करने योग्य बिट कि हम दिए गए मॉडल के लिए अनुमति की पहचान कर सकते हैं (जो हम मॉडल की पहचान करेंगे होना चाहिए इसके सामग्री प्रकार से)।
इसके बाद, हम हमारी नीतियों व्यवस्थापक में, फिर से एक सामान्य मॉडल के माध्यम से लागू कर सकते हैं:
moderated.admin.py
class ModeratedModelAdmin(admin.ModelAdmin):
# Save our request object for later
def __call__(self, request, url):
self.request = request
return super(ModeratedModelAdmin, self).__call__(request, url)
# Adjust our 'is_approved' widget based on the parent permissions
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name == 'is_approved':
if not self.request.user in self.get_parent_instance().can_approve.all():
kwargs['widget'] = forms.CheckboxInput(attrs={ 'disabled':'disabled' })
# Enforce our "unapproved" policy on saves
def save_model(self, *args, **kwargs):
if not self.request.user in self.get_parent_instance().can_approve.all():
self.is_approved = False
return super(ModeratedModelAdmin, self).save_model(*args, **kwargs)
इन एक बार सेटअप और काम कर रहा है, हम फिर से कर सकते हैं उन्हें कई मॉडलों में उपयोग करें जैसा कि मैंने पाया है कि एक बार जब आप इस तरह के कुछ के लिए संरचित अनुमतियां जोड़ते हैं, तो आप आसानी से इसे कई अन्य चीजों के लिए चाहते हैं।
उदाहरण के लिए मान लें कि आप एक समाचार मॉडल है, तो आप बस और यह मॉडल हम अभी किए गए बंद के वारिस बनाने के लिए की आवश्यकता होगी आप अच्छा कर रहे हैं।
# in your app's models.py
class NewsItem(ModeratedModel):
title = models.CharField(max_length=200)
text = models.TextField()
# in your app's admin.py
class NewsItemAdmin(ModeratedModelAdmin):
pass
admin.site.register(NewsItem, NewsItemAdmin)
मुझे यकीन है कि मैं वहाँ में कुछ कोड त्रुटियों और गलतियाँ की, लेकिन उम्मीद है कि इस आप कुछ विचार एक शुभारंभ पैड जो कुछ के लिए आप लागू करने का निर्णय के रूप में कार्य करने के लिए दे सकते हैं हूँ।
आखिरी बात आप क्या करना है, जो मैं आप पर निर्भर छोड़ देंगे, is_approved
मदों के लिए छानने लागू करने के लिए है। (। यानी आप नहीं है ना अन-स्वीकृत आइटम समाचार अनुभाग में सूचीबद्ध किया जा रहा है?)
आप शायद मतलब self.exclude = [ 'को मंजूरी दे दी'] get_form में () और वहाँ भी है changelist_view (में थोड़ा गड़बड़) ;) धन्यवाद, इस महान और टी से बिट्स के साथ संयुक्त लग रहा है पत्थर का जवाब, यह वही है जो मैं देख रहा हूं :) – minder
क्या होगा यदि मुझे 'ऑब्जेक्ट में कोई विशेषता नहीं है' कुकीज '? – andi
क्या व्यवस्थापक मॉड्यूल में कहीं और अनुमतियों को पंजीकृत किया जाना चाहिए? – andi