大多数情况下我使用一个网站的flatpage(来自网站框架)。我如何标记所有创建的页面的现有站点默认值? 每次为每个创建的页面选择相同的网站都是浪费时间。有没有什么办法可以在模型或保存方法中覆盖它?Django flatpage默认网站
6
A
回答
1
8
允许在网站领域的空白(models.py - > FlatPage.sites),并把这个模型中的表格(admin.py - > FlatPageForm)
def clean_sites(self):
sites = self.cleaned_data.get('sites')
print sites
return [Site.objects.get(id=settings.SITE_ID)]
编辑: 我想出了一个更好的解决方案。 这使得当前网站已经专注于ManyToMany网站领域。修改flatpages/admin.py。地址:from django.contrib.sites.models import Site
文件的beggining,把下面的代码class FlatPageAdmin
:
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()]
return super(FlatPageAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
没有必要在简单页面模型允许空白网站领域
1
这里是代码工作完全片解决原来的问题(标记所有创建的flatpages现有站点默认):
from django.conf import settings
from django.contrib.flatpages.models import FlatPage
from django.contrib.sites.models import Site
class CustomFlatPage(FlatPage):
class Meta:
proxy = True
def save(self):
self.sites = [Site.objects.get(pk=settings.SITE_ID)]
super(CustomFlatPage, self).save()
而且该解决方案:
- 只在DB中运行一个INSERT或一个UPDATE。前一个是用一个INSERT和一个UPDATE或两个UPDATE命中DB。
- 通过使用
proxy = True
不需要运行syncbd为了创建CustomFlatPage
模型的额外表格。
1
我采取了不同的方法,猴子修补FlatpageForm元使用自定义小部件的网站。
from django.forms import SelectMultiple
from django.conf import settings
from django.contrib.flatpages.forms import FlatpageForm
class PreSelectDefaultSiteOnCreateSelectMultiple(SelectMultiple):
def render(self, name, value, attrs=None, choices=()):
if value is None:
# None in the add form, a list, possibly empty, in
# the edit form. So we're adding a new instance here.
value = [settings.SITE_ID]
return super(PreSelectDefaultSiteOnCreateSelectMultiple, self
).render(name, value, attrs, choices)
def flatpages():
"""Hack the sites field widget.
"""
fpafm = FlatpageForm.Meta
if getattr(fpafm, 'widgets', None) is None:
fpafm.widgets = {}
fpafm.widgets['sites'] = PreSelectDefaultSiteOnCreateSelectMultiple
您必须在可能使用管理员之前从某处调用flatpages()。我把上面的代码中的模块admin.py在封装monkey_patches,然后在我的根urls.py,其被导入的第一次请求时,我把:
from monkey_patches.admin import flatpages
flatpages()
这是Django的1.4下与Python 2.7.3,但也应该为旧版本工作。
哦,并注意如果你真的想要一个空的网站关联,你可以有意取消它,因为这只是小部件的初始化。后续编辑将传递一个空列表以呈现为值,而不是无。
Bill,KE1G
您的意思是在Django管理员中?或者一般的模型? – Thomas 2011-01-24 20:29:21