0

私は最初の Django アプリを作成しており、いくつかの異なるクラスを持つヘッダー モデルを作成したいと考えています。

コード:

class Meta(models.Model):
    meta_keywords = models.CharField(max_length=500) 
    meta_description = models.CharField(max_length=500)
    page_title = models.CharField(max_length=200)
    page_id = models.CharField(max_length=100)

class Javascript(models.Model):
    page_id = models.CharField(max_length=100)
    status = models.BooleanField()

class Javascript_resources(models.Model):
    page_id = models.CharField(max_length=100)
    status = models.BooleanField() #whether or not these are live/local

class Style_sheets(models.Model):
    page_id = models.CharField(max_length = 100)
    resource_type = models.CharField(max_length = 100)
    status = models.BooleanField()

モデルに関数を作成して、正しいメタ オブジェクト、style_sheets オブジェクト、javascript オブジェクトなどを持つオブジェクトを返すにはどうすればよいでしょうか。

4

4 に答える 4

2

異なるモデルがある場合、1つのモデルが他のモデルを認識していないため、1つのモデルでそのようなメソッドを作成することはできません。それはカプセル化です。

同じ名前(「ステータス」)の異なるフィールドがあるほど、オブジェクトのdictユニオンを作成するのは正常だと思います。

from django.http import HttpResponse
from django.template import RequestContext
...
def your_view( request ):
    t = loader.get_template( your_template )
    if 'page_id' in request.REQUEST:
        page_id = request.REQUEST[ 'page_id' ]       

        all_objs = { 'metas': Meta.objects.filter( page_id = page_id ),
                        'javascripts': Javascript.objects.filter( page_id = page_id ),
                        'javascript_resources': JavascriptResources.objects.filter( page_id = page_id ),
                        'style_sheets': StyleSheets.objects.filter( page_id = page_id ) }
        c = RequestContext( request, all_objs )
    else:
        c = RequestContext( request )

    return HttpResponse( t.render(c), content_type = 'text/html' )

次に、テンプレートでそれらを反復処理できます(javascriptの例)。

{% for javascript in javascripts %}
    {% if javascript.status %}
        ...
    {% endif %}
{% endfor %}

実装の詳細は、カスタムpage_idを持つオブジェクトが存在するかどうかによって異なります。存在を確認する必要があるかもしれません。

于 2012-08-14T07:57:02.847 に答える
1

すべてのモデルがページを参照しているように見えるので、おそらくPageモデルを作成して、次のように置き換える必要がpage_idsありForeignKeysます。

class Page(models.Model):
    title = models.CharField()


class Meta(models.Model):
    meta_keywords = models.CharField(max_length=500) 
    meta_description = models.CharField(max_length=500)
    page_title = models.CharField(max_length=200)
    page = models.ForeignKey(Page)

それでも、ページのすべての部分を別々のモデル(=データベース内のテーブル)に含めることは、あなたのユースケースを正確には知りませんが、どういうわけかやり過ぎだと思います。もう1つの可能性は、多重継承を使用してこれらのモデルを1つに結合することです。

于 2012-08-14T08:00:50.303 に答える
0

Django では、models.py でデータベース構造を定義し、views.py でほとんどの関数を予約します。特定のパラメーターに基づいてレコードを取得する関数を作成しようとしているようです。そのためには、テーブルから関連するレコードを取得して返す関数を views.py に定義します。

ここにある Django チュートリアル、特に 3 ページを参照することをお勧めします。

https://docs.djangoproject.com/en/dev/intro/tutorial03/

于 2012-08-14T07:02:14.190 に答える
0

私の場合、この問題の最善の解決策は次のようになりました。

いくつかの理由から、関連ファイルをデータベースに保存するのが好きです。私の設定ファイルには、サイトのヘッダー全体を制御できるステータス設定があります。ライブ/ローカルのみの特定のファイルと、リソースであるファイルがあります。たとえば、ローカルではあまり CSS を使用しませんでしたが、ライブ サイト用にコンパイルしました。この変数を変更すると、データベースに適切なファイルを照会することで、ヘッダーが自動的に変更されます。また、css/js ファイルが正しくロードされないときにデバッグするのは非常にイライラする可能性があるため、ファイルの存在も確認します。少しやり過ぎですが、多くのサイトで使用されます。

from models import *

from django.conf import settings from os import path # import os.path と書くこともできます

クラス リソース(オブジェクト):

status = True
page_id = ""


# META INFORMATION
meta_keywords = ""
meta_description = ""
page_title = ""
favicon = ""

# RESOURCES
javascript_resources = []
javascript_files = []
style_sheets = []

def __init__(self, page_id = "home"):
    self.page_id = page_id.lower()
    self.get_status()
    self.get_meta()
    self.get_javascript()
    self.get_style_sheets()

def get_status(self):
    status = settings.SITE_STATUS

    if(status != "live"):
        self.status = False
    else:
        self.status = True


def get_meta(self):
    current = Meta.objects.get(page_id = self.page_id)
    self.meta_keywords = current.meta_keywords
    self.meta_description = current.meta_description
    self.page_title = current.page_title
    self.favicon = current.favicon

# this function will set all of the proper javascript lists and validate all files!
def get_javascript(self):


    javascript_list = Javascript.objects.filter(Q(page_id = "all") | Q(page_id = self.page_id)).filter(status = self.status)
    javascript_resources_list = Javascript_resources.objects.filter(Q(page_id = "all") | Q(page_id = self.page_id)).filter(status = self.status)

    #now evaulate the javascript
    if len(javascript_list) > 0:
        for resource in javascript_list:
            file_name = resource.url

            if self.exists(file_name):
                self.javascript_files.append(file_name)

    if len(javascript_resources_list) > 0:
        for resource in javascript_resources_list:
            file_name = resource.url

            if self.exists(file_name):
                self.javascript_resources.append(file_name)


def get_style_sheets(self):

    style_sheet_list = Style_sheets.objects.filter(Q(page_id = "all") | Q(page_id = self.page_id)).filter(status = self.status)


    if len(style_sheet_list) > 0:
        for resource in style_sheet_list:
            file_name = resource.url
            file_type = resource.file_type

            if self.exists(file_name):
                style_sheet = []
                style_sheet.append(file_type)
                style_sheet.append(file_name)

                self.style_sheets.append(style_sheet)

def exists(self, file_name):

    url = settings.STATIC_URL + file_name

    status = False

    if  path.exists(url):
        status = True

    return status
于 2012-08-15T07:32:15.350 に答える