[英]Accessing URL variables in Django 1.5 class-based view
我正在將項目從Django 1.2遷移到Django 1.5。 該項目使用了基於函數的視圖,例如:
def notecard_product(request, stockcode):
if request.user.is_authenticated():
liked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=True, user=request.user)
unliked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=False, user=request.user)
extra_context = {"liked" : liked, "unliked":unliked}
else:
extra_context = {"liked" : [0], "unliked": [0]}
return object_detail(request, queryset=Product.objects.live(),
object_id=stockcode,
extra_context=extra_context,
template_name='products/notecard.html', template_object_name='notecard_product')`enter code here`
在此摘錄中,從URL捕獲了stockcode
代碼, stockcode
其用於確定object_id
。 所以我想知道如何在基於類的視圖中執行此操作。 這是我到目前為止的內容:
class NotecardProductListView(ListView):
queryset=Product.objects.live()
pk=self.kwargs['stockcode']
template_name='products/notecard.html'
context_object_name='notecard_product'
def get_context_data(self, **kwargs):
context = super(BooksListView, self).get_context_data(**kwargs)
if self.request.user.is_authenticated():
liked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=True, user=self.request.user)
unliked = Recommendation.objects.values_list('product_id',flat=True).filter(recommended=False, user=self.request.user)
extra_context = {"liked" : liked, "unliked":unliked}
else:
extra_context = {"liked" : [0], "unliked": [0]}
context.update(extra_context)
return context
pk
是舊object_id
kwarg的新名稱。 顯然,此代碼不起作用,因為我無法在函數外部訪問self
。 但是我不確定如何做到這一點。 我需要在關鍵字參數中將pk
設置為某種值,但找不到解決方法,因為pk
需要在任何函數之外的類主體中設置。 我也沒有辦法進行試驗和嘗試,因為由於不贊成使用的函數調用,整個項目現在都已中斷。
謝謝!
我不確定您是從哪里得知pk
是object_id
的新名稱,也不確定為什么您認為需要將其設置為每個請求的值。 基於類的視圖中的類級別屬性的要點是,它們是按視圖類而不是按實例設置的:它們是指視圖將去查找值的位置,而不是實際值本身。
您的第一個錯誤是,舊的object-detail
視圖的等效部分毫不奇怪object-detail
是DetailView
而不是ListView
。 如文檔所示,ListView能夠通過繼承自SingleObjectMixin
來顯示對象詳細信息。 該mixin需要一個名為pk_url_kwarg
的類級別的屬性,該屬性是從URL捕獲的參數的名稱,該參數標識對象的PK:在您的情況下,這是字符串 'stockcode'
。 實例本身負責在任何特定請求中查找該值,您無需這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.