我正在编写我的第一个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对象等的对象。
答案 0 :(得分:2)
如果有不同的模型,您无法在任何模型中创建此类方法,因为一个模型不了解其他模型。这是一个包装。
我认为制作对象的字母组合是正常的,你拥有的字段越多,具有相同的名称(' status')。
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的对象。也许你应该检查一下。
答案 1 :(得分: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)
尽管如此,我认为将页面的所有部分放在单独的模型中(=数据库中的表格)在某种程度上是矫枉过正的,尽管我并不完全了解您的用例。另一种可能性是使用多重继承将这些模型组合在一起。
答案 2 :(得分:0)
在Django中,您可以在models.py中定义数据库结构,并在views.py中保留大多数函数。您似乎正在尝试创建一个函数,根据某些参数获取记录。为此,在views.py中定义一个函数,该函数从表中获取相关记录并将其返回给您。
我建议你浏览这里的Django教程,特别是第3页。
答案 3 :(得分:0)
在我的情况下,针对此问题的最佳解决方案最终看起来像这样:
我喜欢将相关文件存储在数据库中,原因有几个。在我的设置文件中,我有一个状态设置,允许我控制整个网站的标题。我有某些文件只有实时/本地,有些文件是资源。例如,我在本地使用较少的css但是为实时站点编译它。当我更改此变量时,这会通过查询数据库以获取正确的文件来自动更改我的标头。我还检查文件是否存在,因为当css / js文件无法正确加载时调试会非常令人沮丧!它有点矫枉过正,但会用于很多网站。
from models import *
来自django.conf导入设置 从os import path#也可以写成import os.path
class Resources(object):
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