2011-01-24 11 views
6

अधिकतर मैं एक साइट (साइट ढांचे से) के लिए फ्लैटपृष्ठ का उपयोग करता हूं। मैं सभी निर्मित फ्लैटपृष्ठों के लिए मौजूदा साइट डिफ़ॉल्ट को कैसे चिह्नित कर सकता हूं? हर बार बनाए गए प्रत्येक पृष्ठ के लिए एक ही साइट चुनने के लिए समय बर्बाद है। क्या मॉडल में इसे ओवरराइड करने या विधि सहेजने का कोई तरीका है?Django flatpages डिफ़ॉल्ट साइट

+0

आपका मतलब Django व्यवस्थापक में है? या सामान्य रूप से मॉडल पर? – Thomas

उत्तर

1

यहाँ मेरी कोड है, यह काम करता है:

+0

उस कोड को कहां रखा जाए? – robos85

+0

@ robos85 models.py फाइल –

+1

यह पूरी तरह गलत है! इस तरह आप हमेशा एक ही साइट का चयन करेंगे, भले ही आप इसे व्यवस्थापक पृष्ठ में साइट पर बदल दें जहां pk == 2। – seler

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)] 

संपादित करें: मैं एक बेहतर समाधान के साथ आ गए हैं। यह वर्तमान साइट को पहले से ही कईToMany साइट फ़ील्ड में केंद्रित करता है। 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) 

+0

स्पष्ट होने के लिए, आपको Django कोर के अंदर flatpages/admin.py संपादित नहीं करना चाहिए। आप अपनी खुद की अनुप्रयोग में Flatpages व्यवस्थापक वर्ग उपवर्ग चाहिए और formfield_for_manytomany() विधि ओवरराइड और इन पंक्तियों जोड़ें। –

+0

@JeremyBlanchard, सुनिश्चित करें कि मैं :) – seler

1

यहाँ कोड का एक पूरी तरह से काम कर रहे टुकड़ा को सुलझाने है FlatPage मॉडल में साइटों क्षेत्र में खाली के लिए अनुमति देने के लिए कोई जरूरत नहीं है

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

इसके अलावा इस समाधान:

०१२३५१६४१० मूल समस्या ( सब बनाया flatpages के लिए मौजूदा साइट डिफ़ॉल्ट चिह्नित करने के लिए)
  • डीबी में केवल एक INSERT या एक अद्यतन चलाता है। पिछला एक डीबी को एक इंसर्ट और एक अपडेट, या दो अपडेट के साथ मार रहा था।
  • सिंकबी चलाने के लिए CustomFlatPage मॉडल के लिए अतिरिक्त तालिका बनाने के लिए आवश्यक नहीं है।
+0

क्या बयान अपने आप को ठीक है, इस कोड को नहीं काम करता है करते हैं, कारण Django से पहले उदाहरण के एक प्राथमिक कुंजी है कई-से-अनेक रिश्ते बनाने के बारे में शिकायत। तो, यह 'सुपर (CustomFlatPage, आत्म) .save()' 'से पहले self.sites = जोड़ा जाना चाहिए [Site.objects.get (पी = settings.SITE_ID)]' – ygneo

+0

इस अभ्यस्त काम अगर आप अधिक करना चाहते हैं 1 साइटों से अधिक। – seler

+0

क्यों यह 1 से अधिक साइट पर काम नहीं करेगा? 'Site.objects.get (pk = settings.SITE_ID) 'आपको जिस साइट की आवश्यकता है उसे वापस कर देगा, भले ही आपने कितनी साइटें बनाई हों, है ना? – ygneo

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 

आपको व्यवस्थापक का उपयोग करने से पहले कहीं से फ्लैटपेज() को कॉल करना होगा। मैं कोड के ऊपर एक मॉड्यूल admin.py में एक पैकेज monkey_patches में फिर मेरी जड़ urls.py है, जो पहली बार एक अनुरोध में आता है आयात होता है में डाल दिया,, मैं डाल:

from monkey_patches.admin import flatpages 
flatpages() 

यह Django 1.4 के अधीन है पायथन 2.7.3 के साथ, लेकिन पुराने संस्करणों के लिए भी काम करना चाहिए।

ओह, और ध्यान दें कि यदि आप वास्तव में एक खाली साइट एसोसिएशन चाहते हैं, तो आप जानबूझकर इसे अचयनित कर सकते हैं, क्योंकि यह केवल विजेट प्रारंभिक है। बाद के संपादन मूल्य के रूप में प्रस्तुत करने के लिए एक खाली सूची पास करेंगे, जो कोई नहीं है।

बिल, केई 1 जी

संबंधित मुद्दे