2010-10-25 6 views
2

J'ai une application portfolio qui répertorie les projets et leurs pages détaillées. Chaque projet a généralement la même information (galerie, etc.), mais parfois l'utilisateur peut vouloir ajouter des informations supplémentaires pour un projet particulièrement important, peut-être une page supplémentaire sur le financement de cette page par exemple. Est-il possible de créer un modèle de pages à plat remplacées dans mon application de portefeuille qui oblige les pages flat créées dans cette application à toujours commencer par/portfolio/project-name/flat-page. Je pourrais alors simplement passer les liens vers les flatpages associés au projet vers le template afin que toute page flat générée par l'utilisateur soit automatiquement liée à partir de la page du projet.Étendre les pages flat pour une application spécifique

EDIT

Je l'ai travailler un peu maintenant

J'écrasent le modèle flatpage dans mon application de portefeuille comme décrit:

from django.contrib.flatpages.models import FlatPage 
from project import Project 
from django.db import models 
from django.contrib.sites.models import Site 

class ProjectFlatPage(FlatPage): 
    prefix = models.CharField(max_length=100) 
    project = models.ForeignKey(Project) 

qui me permet d'associer cette flatpage avec projet particulier,

Ensuite, je écraser la méthode de sauvegarde pour écrire tous les suppléments dans formation lorsqu'un utilisateur enregistre (doit être tondu):

def save(self, force_insert=False, force_update=False): 
    self.url = u"%s%s/" % (self.project.get_absolute_url(),self.prefix) 
    self.enable_comments = False 
    self.registration_required = False 
    self.template_name = 'project/project_flatpage.html' 
super(FlatPage, self).save(force_insert, force_update) 

et je scaleback l'administrateur juste laisser les choses importantes:

class ProjectFlatPageForm(forms.ModelForm): 
    prefix = forms.RegexField(label=_("Prefix"), max_length=100, regex=r'^[a-z0-9-]+$'), 

    class Meta: 
     model = ProjectFlatPage 

class ProjectnFlatPageAdmin(admin.ModelAdmin): 
    form = ProjectFlatPageForm 

maintenant l'utilisateur peut ajouter une page à plat dans mon app et l'associer à un projet particulier.

Dans l'administration, ils suffit d'entrer une limace pour la page et il est automatiquement joint en annexe par la sauvegarde() méthode comme:/projets/nom-projet/plat pages nom/

Le problème restant est à la fin du gabarit. Je peux accéder aux informations flatpage normales à travers les balises de modèles donnés {{flatpage.title}} et {{flatpage.content}} mettre je n'ai pas accès aux champs supplémentaires du modèle hérité (ie le champ de projet)

Y a-t-il de toute façon autour de ça?

EDIT2

Après avoir pensé, le plus simple est d'écrire une étiquette de modèle pour trouver le projectFlatPage associé au flatpage et avoir accès à partir de là. Un peu comme l'écrasement des balises du template flatpages par défaut

Répondre

1

bien sûr. il suffit d'écrire votre propre flatpage-modèle, par exemple

from django.contrib.flatpages.models import FlatPage 

class MyFlatPage(FlatPage): 
    prefix = models.CharField(max_length=100, editable=False 
    url = models.CharField(_('URL'), max_length=100, db_index=True, editable=False) 

puis ajoutez une MyFlatPageAdmin appropriée à votre fichier admin.py (si vous le souhaitez, vous pouvez importer le flatpageadmin de django.contrib.flatpages.admin et hériter de il). après tout, vous utilisez le modèle flatpage, mais remplacez le champ urls. Maintenant, ajoutez un signal, qui concatène le préfixe et un suffixe url généré automatiquement à l'URL (comme l'ID de l'objet). vous pouvez maintenant ajouter la flatpage personnalisée comme

flatpage = MyFlatPage(prefix='/portfolio/my-super-project/') 

tout est clair maintenant?

modifier 1

comme vous pouvez le lire in the documentation, chaque flatpage devrait être un projectflatpage et vice versa.

3

Dans la partie 'Édition 2' de votre question ... puisque votre modèle de flatpage personnalisé hérite de FlatPage, il existe une relation de champ un-à-un automatique créée entre eux par Django.

Donc, dans votre modèle, si vous savez que l'objet flatpage transmis est l'un de vos proches personnalisés, vous pouvez accéder à vos attributs supplémentaires par:

{{ flatpage.projectflatpage.project }} 
Questions connexes