Ich habe diese Funktionalität kürzlich in einem Projekt implementiert. Dies kann durch Verwendung automatisch generierter UUIDs geschehen. Django hat a built-in model field dafür, oder Sie können ein Slug-Feld verwenden und geben Sie einen Standardwert. Hier ist ein kurzes Beispiel.
Importieren Sie in Ihrer models.py-Datei die UUID-Bibliothek, und legen Sie den Standardwert Ihres Slug-Felds auf UUID.UUID4 fest.
models.py:
import uuid
class Ticket(models.Model):
uuid = models.SlugField(default=uuid.uuid4, editable=False)
...
In urls.py, benutzen Sie einfach die UUID Feld, als wäre es ein Stück waren. Etwas wie folgt aus:
url(r'^manager/tickets/(?P<uuid>[0-9a-z-]+)/?$', TicketDetail.as_view(), name='ticket-detail'),
In Ihrem Detail, Aktualisieren und Löschen von Ansichten, müssen Sie sicherstellen, und legen diese beiden Attribute, so dass Django weiß, welches Feld als Schnecke zu verwenden:
slug_field = 'uuid'
slug_url_kwarg = 'uuid'
Dann in Ihren Vorlagen und wann immer Sie ein Objekt für die Kwargs abrufen müssen, verwenden Sie einfach die UUID anstelle von PK.
Hinweis: Darüber hinaus sollten Sie auch alles mit Berechtigungen ausführen, um zu verhindern, dass Benutzer andere Seiten sehen. Möglicherweise können Sie bestimmte Konten sperren, um andere Personen anzuzeigen. Zum Beispiel könnten Sie wahrscheinlich einen Berechtigungs-Mix schreiben, um zu überprüfen, ob request.user mit dem Objekt übereinstimmt, das die Ansicht verarbeitet.
TLDR Das setzt voraus, dass Sie irgendeine Art von Beziehung zu einem Benutzer auf Ihrem Ticket
Modell haben:
class SameUserOnlyMixin(object):
def has_permissions(self):
# Assumes that your Ticket model has a foreign key called user.
return self.get_object().user == self.request.user
def dispatch(self, request, *args, **kwargs):
if not self.has_permissions():
raise Http404('You do not have permission.')
return super(SameUserOnlyMixin, self).dispatch(
request, *args, **kwargs)
Schließlich hält es wie folgt zu Ihrer Ansicht auf:
class TicketDisplay(LoginRequiredMixin, SameUserOnlyMixin, DetailView):
...