2011-01-24 60 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