2011-01-24 57 views
6

大多数情况下我使用一个网站的flatpage(来自网站框架)。我如何标记所有创建的页面的现有站点默认值? 每次为每个创建的页面选择相同的网站都是浪费时间。有没有什么办法可以在模型或保存方法中覆盖它?Django flatpage默认网站

+0

您的意思是在Django管理员中?或者一般的模型? – Thomas 2011-01-24 20:29:21

回答

1

这里是我的代码,它的工作原理:

+0

在哪里放置代码? – robos85 2011-02-11 15:04:35

+0

@ robos85 models.py文件 – 2011-02-23 16:27:32

+1

这是完全错误的!这样,即使您在管理页面中将其更改为pk == 2的网站,也会始终选择相同的网站。 – seler 2011-05-06 22:26:25

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