Frage

Mit Marius Gedminas ausgezeichnete Blog-Post , habe ich erstellt ein benutzerdefinierte traverser für einen Ordner in meiner Website.

Dies ermöglicht es mir zu zeigen: http://foo.com/folder/random_id

Statt: http://foo.com/folder/object.html?id=random_id

Die Konfigurationsseite funktioniert gut, ich die random_ids fangen und für die richtige durch meine Nachrichten suchen, bereit angezeigt werden soll.

Mein Problem ist, dass ich bin nicht sicher, wie dann die Daten über meine üblichen Seitenvorlagen angezeigt werden - am TODO Punkt in seinem ursprünglichen Code;)

if name == 'mycalendar':
            mycalendar = ... # TODO: do something to get the appropriate object
            return mycalendar

Normalerweise würde ich etwas verwenden, ähnlich wie:

class Test(BrowserPage):

    template = ViewPageTemplateFile('atest.pt')

    def __call__(self):
        return self.template()

Aber ich kann nicht arbeiten, wie dies im Rahmen der benutzerdefinierten Traversal richtig zu tun.


UPDATE : sein löschen I will vermeiden Zugabe von etwas anderes auf die URL ( Nein : http://foo.com/folder/random_id/read ).

I nicht müssen die Ansicht über eine andere Adresse verfügbar sein ( Nein : http://foo.com/folder/read )

Die ZCML für die Ansicht, die ich zu verwenden möchten, ist:

<browser:page
  for="foo.interfaces.IFooFolderContainer"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>

Ich vermute (auf weitere Beratung), etwas entlang der Linien von:

return getMultiAdapter((mycalendar, self.request), IPageTemplate, name=u'read')

Oder sogar eine Standardansicht für den Objekttyp (a dict in diesem Fall), die zurückgegeben werden:

<browser:page
  for="dict"
  name="read"
  template="read.pt"
  permission="zope.ManageContent"
/>
War es hilfreich?

Lösung

Es wäre einfacher, Ihre Frage zu beantworten, wenn Sie zeigt, was Ihr individuelles traverser tut.

Im Grunde wollen Sie so etwas wie folgt aus:

def publishTraverse(self, request, name):
    if name in self.context:
        return MyMessageView(self.context[name], request)

    # fall back to views such as index.html
    view = queryMultiAdapter((self.context, request), name=name)
    if view is not None:
        return view

    # give up and return a 404 Not Found error page
    raise NotFound(self.context, name, request)

Dabei gilt MyMessageView als

etwas so einfach sein
class MyMessageView(BrowserPage):
    __call__ = ViewPageTemplateFile('read.pt')

Disclaimer: Ich bin sicher nicht, wenn die Ansicht, die Sie direkt von einer Sicherheitsumhüllung geschützt werden instanziiert; stellen Sie sicher, Ihre Funktionstests gewährleisten anonyme Benutzer keine Nachrichten anzeigen können, wenn das, was Sie wollen.

Andere Tipps

Wenn Sie an einem geeigneten Objekt mit Ihrem eigenen traverser am Ende, können Sie einfach auf den in dieser Vorlage Vorlagennamen und Benutzer „Kontext“ tack. So http://foo.com/folder/random_id/my_template und in der Vorlage der normalen <h1 tal:content="context/title" /> Sachen tun.

IIUC, was Sie wollen, ist es, die ‚lesen‘ Ansicht zu machen, wenn jemand Anfragen / Ordner / random_id. Wenn das der Fall ist, alles was Sie brauchen zu tun ist Ihre Traversal ein Objekt zurückgeben machen (IFolderContent, vielleicht), die eine random_id und geben Sie die ‚Ansicht‘ Seite als die Default für IFolderContent.

die Default ist erforderlich, da gibt es keinen Blick für das random_id Objekt angegeben in der URL.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top