簡體   English   中英

帶有Slug的Django Deliciouspie覆蓋URL

[英]Django Tastypie Override URL with slug

我有類似的感覺:

def override_urls(self):
    return [
        url(r"^(?P<resource_name>%s)/(?P<slug>[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
    ]

產生如下URL:

/api/v1/nodes/<slug>/

一切正常,除了self.get_resource_uri(bundle)返回/api/v1/nodes/<id>/並且我無法有效地將當前URL與資源URI進行比較。

我究竟做錯了什么?

解決方案:工作代碼

我在這里實現了建議的解決方案: https : //github.com/ninuxorg/nodeshot/blob/refactoring/nodeshot/core/base/resources.py

歡迎提供任何其他改進建議。

您可以在資源上覆蓋get_resource_uri以返回正確的uri。 歸根結底,正確的是那些有the的人,因為那是資源捕獲的(第一個)人。

更新資料

正確的方法實際上是跳過override_urls並將其放在資源的Meta上:

detail_uri_name = 'slug'

TLDR背景

我挖得更深一些,看來有更好的地方可以實現這一點。 get_resource_uri的默認實現(間接)調用self.detail_uri_kwargs然后reverse

ModelResourcedetail_uri_kwargs的默認實現只是查找self._meta.detail_uri_name (其名稱不直觀),然后從模型中獲取該鍵。 detail_uri_name默認為pk

如果您只是在此處提供其他名稱,則可以跳過override_urls和get_resource_uri!

這樣的事情(基於OP注釋鏈接的代碼):

from tastypie.resources import ModelResource
from tastypie.bundle import Bundle

class BaseSlugResource(ModelResource):
    """ Base Model Resource using slug urls """

    class Meta:
        abstract = True
        detail_uri_name = 'slug'

我不確定該資源Meta是否繼承(我想他們不是),所以這可能不能作為基類。 幸運的是,所需的一行可以很好地粘貼到每個需要它的資源中。

即使@dokkaebi的答案被標記為(並且部分正確),我還是想用一個可行的例子來清理它。 唯一缺少的部分是,您仍然必須在將要列出的URL之前加前綴

from tastypie.resources import ModelResource
from myapp.models import SomeModel

class BaseSlugResource(ModelResource):
    """ Base Model Resource using slug urls """

    class Meta:
        queryset = SomeModel.objects.all()
        detail_uri_name = 'slug'

    def prepend_urls(self):
        return [
            url(r'^(?P<resource_name>%s)/(?P<slug>[\w\.-]+)/$' % self._meta.resource_name, self.wrap_view('dispatch_detail'), name='api_dispatch_detail'),
        ]

這將顯示正確的resource_uri用於列出以及獲取資源。 但是,您很可能會丟失{schema}資源(即/ api / posts / schema /),因為它也被視為一種資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM