DjangoでFlatpagesを拡張して使用します。 CKEditorを埋め込む

こんにちは、今日は、データベース内の個々のレコード(ListView、TemplateViewなど)ではなく、通常のページを格納するモデルの作成方法についてお話したいと思います。 これは、Djangoフラットページに存在する既存の拡張および補完方法に関するものです。 しかし、私が遭遇した問題と、この機能を共有することにした理由についてお話したいと思います。 多くの場合、サイト管理者の管理パネルで通常のページの機能を実装する必要がある場合があります(データベースの1つのエントリは、特定のページのURL、コンテンツ、および追加情報が書き込まれる1つのページです)。 したがって、管理パネルからURLとコンテンツを使用して新しいページを直接作成できます。



例を挙げましょう:タスクはそのようなページを実装するように設定されていて、通常のテキストフィールドがあり、ckeditorがねじ込まれ、管理者は会社に関する希望のテキストを変更および記述し、書き換えることができます。 最初に訪問するのは、テンプレートビューに基づいてクラスを作成するためのモデルとコントローラー(ビュー)の通常のエントリであり、ページは問題なく作成されました。 しかし、これは非常に悪いスタイルであることを理解し始め、この管理者がデータベースに新しいレコードを追加し始めると、レイアウトはうまくいきます。 たとえば、メソッドget_context_dataまたはget_queryset(ListView)をオーバーライドする方法をすぐに思い付きます。 そこで、管理者自身が目的のページを編集する必要な選択を行います(たとえば、データベースから最初のレコードのみを取得します)が、データベースには新しいレコードを追加する機会がありますが、これは単に無視されます。 さらにいくつかの方法を考え出したので、私はこのベンチャーを捨てました。 これが悪い形だと考えて、Djangoのフラットページの存在を思い出しましたが、機能を更新すると、データコンテキストに何かを追加することは不可能であることが明らかになりましたが、たとえば、「テンプレートエンジン」によって処理される目的のテンプレートを指定できますが、ここでは、テキストフィールドで指定したテキストは「テンプレートエンジン」によって処理されません。 これは検討する価値がありますが、私にとっては大きな問題ではありませんでした。 しかし、何が起こったのかというと、元々は拡張可能なモジュールではなくフラットページであり、そのような重要なエディターをねじ込むことは不可能でした。 これをどのように実装できるかを考えなければなりませんでした。 しかし、まさにこの機能が必要でした。 入門編の後、このような優れたモジュールフラットページのより詳細な調査に移りましょう。しかし、残念ながら劣っていますが、修正しましょう。



Jungの静的ページとは-これらは、モデルに保存されたデータに基づいてコンテンツが生成されないが、対応する事前定義フィールドに通常のhtmlコードの形式で設定されるページです。



主な欠点:



  1. データはモデルのデータに基づいて生成されないため、views.py(MVTではなくMVCによってコントローラーと呼びます)では、何らかの方法でデータコンテキストを処理、補完、または配置することはできません。 また、最初にモデル(models.py)を展開または変更することもできません。
  2. このようなページのコンテンツは純粋なhtmlコードである必要があります。これが、フラットページがボックスよりも劣る主な理由です。 このコードは「テンプレートエンジン」によって処理されないことも理解する価値があります。


主な利点:



  1. フラットページのコンテンツには、ページのWebアドレス、タイトル、コンテンツ、そして最も重要なテンプレートファイルへのパスが含まれます。 データを転送することはできませんが、最後の項目はキーですが、以下を使用して目的のページを作成できます。タグとジャンガ変数を使用して設定されたメニューを持つ基本テンプレートを使用して、 、「含まれるテンプレート」などを接続します。
  2. モデルの1つのエントリは、サイトの1ページに対応します。これは大きなプラスであり、システムが適切に完全に構​​成されているため、独自の自転車を作成できません。


プロジェクトのセットアップ:



  1. settings.pyに追加します。



    INSTALLED_APPS = [ … 'django.contrib.sites', '''     web-    Django.   ,      flatpages.''' 'django.contrib.flatpages', 'flatpage_main' #  ,    . … ]
          
          



  2. プロジェクト(settings.py)SITE_ID = 1に追加し、MIDDLEWARE 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'で、
  3. データベースと同期して、必要なテーブルをデータベースに追加します( 'flatpage_main'のステップ5までINSTALLED_APPSに書き込まないでください)。
  4. 管理サイトにアクセスして、すべてが機能することを確認します。 「シンプルページ」列が表示されます。
  5. 新しいアプリケーションを作成します-python manage.py startapp 'flatpage_main'。
  6. インターネット上でckeditorをセットアップしました。この資料はすでにそこにあります。インストールして構成し、この例で使用する方法を学べると思います。 必要に応じて、Habrに関する記事を書きますが、この問題に関する資料はインターネット上にあります。


タスクの実装:



  1. モデルに入り、次のコードを追加しましょう-



     from django.db import models from django.contrib.flatpages.models import FlatPage from ckeditor_uploader.fields import RichTextUploadingField class NewFlatpage(models.Model): flatpage = models.OneToOneField(FlatPage) description = RichTextUploadingField(verbose_name = '   ',default='') text_block = RichTextUploadingField(verbose_name='  ',default='') def __str__(self): return self.flatpage.title class Meta: verbose_name = " " verbose_name_plural = " "
          
          





    ここに何が書かれているか見てみましょう:

    ... FlatPageのインポート参照するモデルを追加します。

    ... ckeditorが動作するために必要なRichTextUploadingField特殊フィールドをインポートします



    新しいクラスでは、OneToOneFieldを介してFlatPageモデルを参照することにより、必要な接続を作成します。これにより、フラットページの基本機能を拡張し、拡張することができます。

    そして、管理パネルと将来のページ自体に必要なフィールドを追加します。これにより、必要なコンテンツのフィールドを追加できます。

  2. 次のステップはadmin.pyです。



     from django.contrib import admin from django.contrib.flatpages.admin import FlatPageAdmin from .models import * class NewFlatpageInline(admin.StackedInline): model = NewFlatpage verbose_name = "" class FlatPageNewAdmin(FlatPageAdmin): inlines = [NewFlatpageInline] fieldsets = ( (None, {'fields': ('url', 'title', 'sites')}), (('Advanced options'), { 'fields': ('template_name',), }), ) list_display = ('url', 'title') list_filter = ('sites', 'registration_required') search_fields = ('url', 'title') admin.site.unregister(FlatPage) admin.site.register(FlatPage, FlatPageNewAdmin)
          
          





    分析を始めましょう:



    最初のクラス、NewFlatpageInline、および2番目のクラスの属性、inlines = [NewFlatpageInline]は、これらのクラス間の関係を作成し、同じページ上の2つの関連テーブルのフィールドを表示できるようにします(「親オブジェクトと同じページの関連オブジェクトを編集できます」)。



    フィールドセットを使用すると、親オブジェクト(フラットページ)の管理インターフェイスに表示されるフィールドと設定を設定できます。不要な設定は削除されました。



    最後の2行は、管理パネルでのモデルの削除と登録です。

  3. 3番目のステップはurls.pyです。



      url(r'^main/$', views.flatpage, {'url': '/main/'}, name = 'main'),
          
          





    このページが間違いなく存在することが明確にわかっている場合、この行を追加します。たとえば、メニューなどの基本テンプレートで処理し、テンプレート自体は「テンプレートエンジン」によってレンダリングされるため、テンプレート変数で名前で参照します。

    他のページについては設定できます-
     url(r'^/', include('django.contrib.flatpages.urls')),
          
          





    したがって、他のURLアドレスは、新しいページを作成するときに指定したURLアドレスにバインドされます。

  4. 4番目のステップはテンプレートです。



     {% url 'main' as main %} {% if request.path == main %} <li class="navigation__elem navigation__elem--main navigation__elem--current"> <a href="{% url 'main'%}" class="navigation__href navigation__href--current"><i class="demo-icon icon-main__icon"></i></a></li> {% else %} <li class="navigation__elem nav-active"><a href="{% url 'main'%}" class="navigation__href"><i class="demo-icon icon-main__icon"></i></a></li> {% endif %}
          
          





    コントローラとテンプレートに基づいたフラットページや他のページでメニューがどのように機能するかの例を書いたのですが、ここのコードは非常に明確で理解しやすく、コメントは不要だと思います。 ご覧のとおり、urls.pyからアドレスURL名を取得して処理することは難しくないため、最後の実装の複雑さはなくなりました。



    ページを作成するときに指定したテンプレートの最後のタッチ、管理パネルでページを作成するときに、このページのテンプレートが示されるフィールドがあります(例:main.html)。 このテンプレートでは、変数を使用して必要なフィールドを追加します



     {{flatpage.newflatpage.description|safe}}
          
          





    そして



     {{flatpage.newflatpage.text_block|safe}}
          
          





    、それにより最終ページに必要なデータを表示することができます。 このテンプレートでは、たとえばbase.htmlからの継承など、すべてが他のテンプレートと同じように機能します。

  5. デプロイメント-デプロイメント中に「django.contrib.sites」の作業に関連するいくつかのエラーが発生する場合、シェル(python manage.pyシェル)を入力し、次のコマンドを記述する必要があります。



     >>> from django.contrib.sites.models import Site >>> site = Site.objects.create(domain='http://_.ru/', name=''http://_.ru/) >>> site.save()
          
          





    これは、受信に関する問題の解決に役立つはずです。



それだけです! サイトのページを追加、編集、削除する便利で便利な方法を手に入れました。 アクティブなアイテムと非アクティブなアイテムを切り替えることができるメニューを実装する方法を学びましたが、それがフラットページであるかコントローラーのあるページであるかは関係ありません。 また、ckeditorと協力して、それを構成する方法を見つけました。 関連するすべての瞬間と困難を整理しました。 そして最も重要なことは、それらをすべて組み合わせて便利で便利なツールを作成することで、将来的にサイトを正しく管理し、開発することを可能にします。もちろん、エンドユーザーにとって便利です。 この記事がお役に立てば幸いです。 誰かが時間を節約します。 そして、誰かが追加のヒントの下にコメントを書いてそれを補完します!



All Articles