2009-06-10 19 views
0

Sicherlich nicht eine neue Frage denke ich, aber hier geht es:einschränken Seitenansicht Zugriff auf bestimmte Benutzer/Kunden

In meinem Django basierte Bestellsystem jeden Benutzer (wer nicht Personal) zu einem CustomerProfile Objekt bezieht, die vergleicht diesen Benutzer mit dem richtigen Kundenobjekt. Diese Kundenbenutzer können sich anmelden und offene Rechnungen anzeigen. Um zu sehen, Rechnungen eines Kunden navigieren Sie zu so etwas wie dieses:

/Rechnungen/Kunde/97/

(Customer Invoice # 97)

was in Ordnung ist, aber ich brauche etwas Authentifizierung so einen Benutzer zu übernehmen Wer Teil eines Kundenprofils ist, kann die Rechnungen eines anderen Kunden nicht anzeigen, indem er beispielsweise manuell/rechnungen/Kunde/92/eingibt (die Rechnung 92 gehört einem anderen Kunden).

Ich habe das bekommen, aber es ist wirklich nicht gut Code (und nicht funktioniert):

def customer_invoice_detail(request, object_id): 
    user = threadlocals.get_current_user() 
    try: 
     userprofile = UserProfile.objects.get(user=user) 
     user_customer = userprofile.customer.id 
    except UserProfile.DoesNotExist: 
     user_customer = None 
    if (request.user.is_authenticated() and user_customer is not null) or request.user.is_staff(): 
     invoice = CustomerInvoice.objects.get(pk=object_id) 
     product_list = CustomerInvoiceOrder.objects.filter(invoice=object_id) 
     context = { 
     'object': invoice, 
     'product_list': product_list, 
     } 
     return render_to_response("invoices/customer_invoice_detail.html", context, context_instance=RequestContext(request)) 
    else: 
     return HttpResponse("You are not authorised to view this invoice") 

müssen mit diesem einen besseren/einfacheren Weg zu bewältigen sein - irgendwelche Ideen?

Prost

Antwort

2

ein Feld zu Ihrer Rechnung Modell hinzufügen Benutzer genannt:

user = models.ForeignKey(User, related_name="invoices") 

dann Datensätze abrufen für einen bestimmten Benutzer wie folgt aus:

invoice = CustomerInvoice.objects.get(pk=object_id, user=request.user) 

Rechnungen für einen bestimmten Benutzer Abrufen ist dann trivial mit der Rückseite Beziehung:

request.user.invoices.all() 

auch sehen Sie die @login_required Dekorateur.

2

Ich würde empfehlen, einig Business-Logik für Ihr Kundenmodell zu machen. Auf diese Weise können Sie eine Methode get_invoices() haben, die nur eine Liste der Rechnungen für diesen Kunden zurückgibt. Diese Methode wiederum würde eine is_authenticated()-Methode aufrufen, die sicherstellt, dass der aktuelle Zustand das Abrufen geschützter Kundendaten ermöglicht oder eine Ausnahme auslöst.

Unabhängig davon, wo Ihr Code versucht, Rechnungen für einen Kunden zu erhalten, wird immer eine Ausnahme ausgelöst, wenn der aktuelle Status keinen Zugriff auf die Rechnungen hat und Sie sich nicht um inkonsistentes Verhalten sorgen müssen Solange Sie diese Methoden verwenden.

Verwandte Themen