【问题标题】:Object not showing in DetailView when using a uuid as primary key使用 uuid 作为主键时,对象未显示在 DetailView 中
【发布时间】:2015-04-29 03:23:56
【问题描述】:

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

但是模板上使用的“标签”( {{ shipping.trackid }} )不起作用...

【问题讨论】:

    标签: django uuid django-generic-views


    【解决方案1】:

    您的模板标签不起作用的原因是您需要实际返回get_object()中的实例:

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

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

    【讨论】:

    • 废话...谢谢它的工作!如果 url 中没有有效的 trackid,我使用 model = get_object_or_404(Shipment, pk=self.kwargs['trackid']) return model 获取 404。
    【解决方案2】:

    为什么不直接加密普通的顺序 ID?对于不知道加密密钥的人来说,ID 看起来是随机的。您可以编写一个包装器,在通往 DB 的途中自动解密 ID,并在从 DB 的途中对其进行加密。我认为这是解决您问题的好方法,只有您知道加密或解密算法。

    【讨论】:

    • 是的,有可能。你有任何关于我该怎么做的例子/教程吗?我不知道怎么...
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 2015-10-27
    • 2023-02-21
    • 1970-01-01
    • 2018-06-08
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多