使用 uuid 作为主键时对象未显示在 DetailView 中
Object not showing in DetailView when using a uuid as primary key
我正在使用它来生成我的主键,因为我不希望它们是容易猜到的简单数字(在这个 post 中找到):
def make_uuid():
return base64.b64encode(uuid.uuid4().bytes).replace('=', '')
这是我的模型:
class Shipment(models.Model):
trackid = models.CharField(max_length=36, primary_key=True, default=make_uuid, editable=False)
如何在使用 url myapp.com/detail/trackid_goes_here 时使 DetailView 视图正常工作?我已经尝试了我在此处看到的所有内容,但仍然无法正常工作。
此外,有没有比使用 uuid 更好的获取唯一主键的方法?
谢谢!
更新:
它现在显示在我的 views.py:
中使用这个的模板
class ShipmentDetailView(DetailView):
template_name = 'shipments/detail.html'
context_object_name = 'shipment'
def get_object(self):
model = Shipment.objects.get(pk=self.kwargs['trackid'])
和urls.py:
url(r'app/detail/(?P<trackid>[\w\d-]+)/$', coreviews.ShipmentDetailView.as_view(), name='shipment'),
但是模板上使用的 "tags" ( {{ shipment.trackid }} ) 不起作用...
为什么不直接加密普通的顺序 ID?对于不知道加密密钥的人来说,ID 似乎是随机的。您可以编写一个包装器,在到达数据库的途中自动解密 ID,并在从数据库返回的途中对其进行加密。我认为这是解决您问题的好方法,只有您知道加密或解密算法。
您的模板标签不起作用的原因是您实际上需要 return get_object()
中的实例:
def get_object(self):
return Shipment.objects.get(pk=self.kwargs['trackid'])
如果您没有 return 任何东西,方法 returns None
(它的默认 return 值);因此您的模板没有任何内容可显示。
我正在使用它来生成我的主键,因为我不希望它们是容易猜到的简单数字(在这个 post 中找到):
def make_uuid():
return base64.b64encode(uuid.uuid4().bytes).replace('=', '')
这是我的模型:
class Shipment(models.Model):
trackid = models.CharField(max_length=36, primary_key=True, default=make_uuid, editable=False)
如何在使用 url myapp.com/detail/trackid_goes_here 时使 DetailView 视图正常工作?我已经尝试了我在此处看到的所有内容,但仍然无法正常工作。
此外,有没有比使用 uuid 更好的获取唯一主键的方法?
谢谢!
更新:
它现在显示在我的 views.py:
中使用这个的模板class ShipmentDetailView(DetailView):
template_name = 'shipments/detail.html'
context_object_name = 'shipment'
def get_object(self):
model = Shipment.objects.get(pk=self.kwargs['trackid'])
和urls.py:
url(r'app/detail/(?P<trackid>[\w\d-]+)/$', coreviews.ShipmentDetailView.as_view(), name='shipment'),
但是模板上使用的 "tags" ( {{ shipment.trackid }} ) 不起作用...
为什么不直接加密普通的顺序 ID?对于不知道加密密钥的人来说,ID 似乎是随机的。您可以编写一个包装器,在到达数据库的途中自动解密 ID,并在从数据库返回的途中对其进行加密。我认为这是解决您问题的好方法,只有您知道加密或解密算法。
您的模板标签不起作用的原因是您实际上需要 return get_object()
中的实例:
def get_object(self):
return Shipment.objects.get(pk=self.kwargs['trackid'])
如果您没有 return 任何东西,方法 returns None
(它的默认 return 值);因此您的模板没有任何内容可显示。