Django flatpages默认网站

时间:2011-01-24 20:26:24

标签: django django-flatpages

我主要使用一个站点的flatpages(来自站点框架)。如何为所有创建的flatpages标记现有网站默认值? 每次为每个创建的页面选择相同的站点都浪费时间。有没有办法在模型或保存方法中覆盖它?

4 个答案:

答案 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()

此解决方案:

  • 仅在DB中运行一个INSERT或一个UPDATE。前一个是用一个INSERT和一个UPDATE或两个UPDATES命中DB。
  • 使用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