2011-02-03 22 views
12

私は管理インターフェースを通して私のDjangoグローバル設定のいくつかを設定したいと思っています。Djangoモデル:モデル内で1つのエントリのみを許可しますか?

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_emailintro_textなどがあるようにしたい:

これらは私が気に設定されています。

管理者ユーザーが既存のレコードの編集を防止して、を新しいレコードに追加できないようにする手段はありますか?

私はこのモデルのためのカスタム管理テンプレートを書くことでこれを行うことができると思いますが、これを構成するためのより良い方法があるかどうかを知りたいと思います。

たとえば、class以外のものを使用できますか?

ありがとうございます!

答えて

14

答えはdjango-dbsettings

更新ちょうど別のオプションを考え

であるように思わthis question on "keep[ing] settings in database"を参照してください:あなたは次のモデルを作成することができますので、OneToOneFieldフィールドの

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) 

を、サイトごとに1つのManagementEmailレコードしか持てません。その後、ちょうどあなたがサイトを使用していて、あなたは以下のようなものを設定を引き出すことができることを確認してください。どのような誰もあなたを言っていることは事実である

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

注こと。設定を保存することを目標としている場合は、フィールドとしてモデルに1つずつ追加するのが最適な実装ではありません。時間が経つにつれて設定を追加することは頭痛になります。モデルにフィールドを追加し、データベース構造を更新し、その設定を呼び出すコードを変更する必要があります。

だからこそ私は上記のdjangoアプリを使用することをお勧めします。これは、ユーザーが編集可能な設定を提供していますので、余分な不要な作業をする必要はありません。

+0

ありがとうございました。私はdjango-dbsettingsを少し気にしています。ここに開発者からのコメントがあります:http://www.chicagodjango.com/blog/django-settings-database/ – AP257

+0

django-dbsettingsに関する彼の苦情のような音は当てはまりませんあなたの場合。コード内のすべての設定を定義しています。私は間違いなくこれを処理するためにあなた自身のシングルトンを書くことをお勧めしたいと思います。 –

+0

デベロッパーからのコメントで、彼はもはや私のことを心配していないと言っています。確かに、私はそれをインストールしようとしたとき、私は 'newforms'について間違いを始めました、それは古い時代だと示唆しています...あなたの代替提案をお試しします、ありがとう! – 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

はい、私はまた、アプリではなくdbで何かを好むでしょう。ただし、質問に記載されているように、管理者ユーザー*は既存のフィールドを編集できる必要があります。新しいアイテムを追加することはできません。何かご意見は? – 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) 

次に、オブジェクトをフィールドにピクル(シリアル化)することができます。

小さなapiを構築すると、あなたはワードプレスとコールのように狡猾になることができます。

次に、カスタム設定をランタイムにロードして、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を参照してください。私が出会ったシングルトンの実装もたくさんあります。唯一つのエントリが

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 
+1

私は、 'self.model.objects.count()> 0 else super()。has_add_permission(request)'が許可管理規則を尊重した方が良いと答えると思います。あなたは、単一のエントリを削除するとエラーがあり –

+0

は、この作品より良い '場合self.model.objects.count()> 0: \t \t \tリターンFalseの他 \t \t: \t \t \tリターンtrue'を – paul100

+0

それならば0を返すと、 'super()。has_add_permission(request)'を評価し、権限がなければエラーを返します。 – radtek

2

するTryジャンゴ・スタンスを残している場合

StackedInlineためには、削除を防ぐために@radtek答えのMAX_NUM = 1

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 

これは、データを編集フォームの投稿からユーザーを防ぐが、起きてから物事を保持しません。管理サイトであなたのニーズに必要だと感じるかどうかに応じて、最小限のコーディングでレコードの削除と追加を可能にすることができます。

関連する問題