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

如果有不同的模型,您不能在任何模型中创建这样的方法,因为一个模型不知道其他模型。这是一个封装。

我认为创建对象的字典并集是很正常的,您拥有的具有相同名称(“状态”)的不同字段越多。

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' )

然后在模板中你可以迭代它们(javascripts的一个例子):

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

实现的细节取决于是否存在具有自定义 page_id 的对象。可能是你应该检查存在。

于 2012-08-14T07:57:02.847 回答
1

由于您的所有模型似乎都引用了一个页面,您可能应该创建一个Page模型并将您的替换page_idsForeignKeys

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)

尽管如此,我认为将页面的所有部分都放在单独的模型中(=数据库中的表)有点过分,尽管我并不完全了解您的用例。另一种可能性是使用多重继承将这些模型组合在一起。

于 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 回答