2017-08-20 4 views
0

In meinem Django-Projekt habe ich Products.Django: Zugriff auf Seite beschränken

Sie können Produkte Zugriff auf diese URL-Muster mit:

example.com/tshirt oder example.com/jacket usw.

Darüber hinaus können Sie einige andere Seiten für diese Produkte sehen, das heißt:

example.com/tshirt/details oder example.com/jacket/buy

Mein Problem: Wenn ich ein neues Produkt in meiner Admin-Oberfläche erstelle, ist das Produkt standardmäßig deaktiviert (ich kann es aktivieren) später). Der Grund ist, dass, wenn ich ein neues Produkt erstelle, ich oft noch nicht alle notwendigen Informationen (d. H. Preis) habe. Solange ein Produkt deaktiviert ist, sollten alle URLs, die mit example.com/this-one-product beginnen, für den normalen Besucher nicht sichtbar sein (404-Fehler erhalten). Leider weiß ich nicht, wie ich das machen soll.

Mein Ziel ist, dass es für den Superuser oder Benutzer von den Mitarbeitern sichtbar ist. Weil es Sinn macht, dass sie dieses Produkt überprüfen und sehen können, wie es aussieht, wenn es gerendert wird. Aber wie gesagt, sollte es für den normalen Besucher der Webseite nicht sichtbar sein.

Jetzt könnte ich natürlich erstellen, wenn Aussagen in all diesen Ansichten (und überprüfen Sie, ob Superuser oder von Personal), aber das klingt nicht wie eine elegante Lösung. Weil ich diese Aussagen zu vielen verschiedenen Ansichten hinzufügen müsste und das ist gegen DRY und ich mag diese Lösung einfach nicht.

Was wäre perfekt: Eine Einstellung zu 404 Fehler für alle Besucher eines Produkts, das deaktiviert ist, zu liefern. Wie ist das möglich?

+0

Sie müssen überschreiben, Sie erhalten queryset mit Ihren Regeln, für weitere Hilfe benötigen Sie Ihre Details anzuzeigen. –

+0

Dies scheint in den Dokumenten beschrieben [https://docs.djangoproject.com/en/1.11/ref/contrib/admin/actions/](https://docs.djangoproject.com/en/1.11/ref/ contrib/admin/actions /) –

+1

Mögliches Duplikat von [Django is \ _staff Erlaubnis Dekorateur] (https://stackoverflow.com/questions/5833184/django-is-staff-permission-decorator) –

Antwort

0

Sie definieren zwei Funktionen, die queryset sichtbar auf die request.user des Typs zurückgeben (Personal/Nicht-Personal)

ich es als queryset Methode

def staff_visible(self): 
    queryset = self.filter(Q(staff_visible=True)) 
    return queryset 

def visible(self): 
    queryset = self.filter(is_active=True) 
    return queryset 

jetzt definieren würden Sie nutzen könnten und bald.

Darüber hinaus könnten Sie zwei benutzerdefinierte Manager-Klasse definieren und get_queryset überschreiben, um eines der beiden obigen zu verwenden.

Verwandte Themen