2017-10-20 4 views
0

ユーザー投稿を管理したい誰かが新しい投稿を作成すると、管理者には表示されますが、htmlでは表示されません。コンテンツが有効な場合、私は許可ボタンを押して、すべてのユーザーに対してhtmlで表示します。私は何かをGoogleにしようとしていたが、役に立たなかった。私は論理が次のようなものでなければならないと考えます:djangoでユーザコンテンツを管理するには?

  1. ユーザーは新しい投稿を作成します。
  2. 管理パネルに投稿が表示されます。
  3. 管理者は投稿を許可します。
  4. 投稿はhtmlで表示されます。

どうすればよいですか?

+2

偽[のBooleanField]をデフォルトis_draftブールフィールドを追加します(https://docs.djangoproject.com/en/1.11/ref/models/fields/#booleanfield) 'models.BooleanField(デフォルト= False)が' –

答えて

1

コメントはBear Brownです。

models.py

class Post(models.Model): 
    title = models.CharField(max_length=100, unique=True)   
    content = models.TextField() 
    is_draft = models.BooleanField(help_text='If checked article gets not published.', default=False) 
    pub_date = models.DateField(default=timezone.now) 

    objects = PublishedManager() 

クエリを経由して、例えばDjangoシェル:

class PublishedManager(models.Manager): 

    def published(self, **kwargs): 
     return self.filter(pub_date__lte=timezone.now(), 
          is_draft=False, 
          **kwargs).order_by('-pub_date') 

views.py

class PostListView(ListView):  
    model = Post 

    def get_queryset(self): 
     queryset = Post.objects.published() 
     return queryset 

テンプレート:

Post.objects.filter(is_draft=False) 

managers.py追加のフィルタのみを返すようにはより低いか、または現在の日付と等しいpub_dateとオブジェクト

{% for post in post_list %} 
    <h1>{{ post.title }}</h1> 
    {{ post.content }} 
{% endfor %} 
+0

はい、マネージャーそれは良い考えです – Anton

0

is_publishedフィールドをモデルに追加することは、これだけが必要で、今後別のものは必要ない場合(たとえば、needs_editing)、簡単な解決策です。ほとんどの場合、そのニーズは迅速に増え、従うのは簡単ではない複雑なコードの悪循環に巻き込まれます。

Django-FSMは、クリーンでドライな方法でこの問題に対応しているモジュールです。素敵な紹介はhereです。

is_new 
is_active 
is_published 
is_draft 
is_deleted 
is_paid 
is_member 
is_* 

相互に排他的な状態...一種の有限状態の間違い

避ける...

ブール値が、状態の数各ブール値と 増加:

2 bools = 2^2 = 4 states 
3 bools = 2^3 = 8 states 
etc (2^N) 

脆弱で状態が多すぎます。