我主要使用一个站点的flatpages(来自站点框架)。如何为所有创建的flatpages标记现有网站默认值? 每次为每个创建的页面选择相同的站点都浪费时间。有没有办法在模型或保存方法中覆盖它?
答案 0 :(得分: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
并将以下代码放入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)
FlatPage模型
中的站点字段不需要允许空白答案 1 :(得分:2)
这是我的代码,它有效:
class CustomFlatPage(FlatPage):
def save(self):
super(CustomFlatPage, self).save()
self.sites = [Site.objects.get(pk=1)]
super(CustomFlatPage, self).save()
答案 2 :(得分: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()
此解决方案:
proxy = True
无需运行 syncbd 即可为CustomFlatPage
模型创建额外的表格。答案 3 :(得分:1)
我采用了不同的方法,猴子修补FlatpageForm Meta以使用网站的自定义小部件。
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中,然后放在我的root urls.py中,它在第一次请求进入时导入,我把:
from monkey_patches.admin import flatpages
flatpages()
这是在使用python 2.7.3的Django 1.4下,但也适用于旧版本。
哦,请注意,如果你真的想要一个空站点关联,你可以故意取消选择它,因为这只是小部件初始化。后续编辑将传递一个空列表以呈现为值,这不是无。
Bill,KE1G