Django сайт по умолчанию - PullRequest
8 голосов
/ 24 января 2011

В основном я использую планшеты для одного сайта (из фреймворка сайтов).Как пометить существующий сайт по умолчанию для всех созданных плоских страниц?Каждый раз тратить время на выбор одного и того же сайта для каждой созданной страницы.Есть ли способ переопределить это в моделях или сохранить метод?

Ответы [ 4 ]

8 голосов
/ 15 апреля 2011

оставьте пустым поле в сайтах (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)]

edit: Я нашел лучшее решение. Это делает текущий сайт уже сфокусированным на поле сайтов 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

2 голосов
/ 24 января 2011

Вот мой код, он работает:

class CustomFlatPage(FlatPage):
    def save(self):
        super(CustomFlatPage, self).save()
        self.sites = [Site.objects.get(pk=1)]
        super(CustomFlatPage, self).save()
1 голос
/ 30 июня 2012

Я выбрал другой подход, обезьяна, исправляя Meta 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, но должен работать и для более старых версий.

О, и обратите внимание, что если вы действительно хотите связать пустые сайты, вы можете отменить это намеренно, так как это всего лишь инициализация виджета.Последующие изменения передадут пустой список для отображения в качестве значения, которое не является None.

Bill, KE1G

1 голос
/ 25 апреля 2011

Вот полностью рабочий фрагмент кода, решающий исходную проблему (, чтобы отметить существующий сайт по умолчанию для всех созданных плоских страниц ):

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

Также это решение:

  • В БД запускается только одна INSERT или одна UPDATE. Предыдущий ударил по БД с одной ВСТАВКОЙ и одним ОБНОВЛЕНИЕМ или двумя ОБНОВЛЕНИЯМИ.
  • При использовании proxy = True необязательно запускать syncbd для создания дополнительной таблицы для CustomFlatPage модели.
...