使用uuid作为主键时,对象不在DetailView中显示

时间:2015-04-29 03:23:57

标签: django uuid django-generic-views

我正在使用它来生成我的主键,因为我不希望它们是简单易于猜测的数字(在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'),

但模板上使用的“标签”({{shipment.trackid}})无效......

2 个答案:

答案 0 :(得分:0)

为什么不加密正常的顺序ID呢?对于不知道加密密钥的人来说,ID似乎是随机的。您可以编写一个包装器,在到DB的路上自动解密ID,并在从DB上的路上对其进行加密。我认为这是解决问题的好方法,只有你知道加密或解密算法。

答案 1 :(得分:0)

模板标记无效的原因是您需要在get_object()中实际返回实例:

def get_object(self):
    return Shipment.objects.get(pk=self.kwargs['trackid'])

如果您没有返回任何内容,则该方法返回None(默认返回值);因此,您的模板无需显示。