在 Django 1.5 的类视图中访问 URL 变量

43 阅读3分钟

在 Django 1.2 中,我们可以使用函数视图来访问 URL 变量。例如,以下代码段展示了一个函数视图,用于获取 URL 中的 stockcode 并将其用作对象 ID:```` 在 Django 1.2 中,我们可以使用函数视图来访问 URL 变量。例如,以下代码段展示了一个函数视图,用于获取 URL 中的 stockcode 并将其用作对象 ID:

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')

在 Django 1.5 中,我们使用类视图来替换函数视图。但是,在类视图中,我们如何访问 URL 变量呢?

2、解决方案

在 Django 1.5 的类视图中,我们可以通过以下步骤来访问 URL 变量:

  1. 在类视图中定义一个类属性 pk_url_kwarg,该属性的值为 URL 中用于标识对象的主键的字段名。例如,在以下代码中,pk_url_kwarg 的值为 'stockcode':
class NotecardProductListView(ListView):
    queryset=Product.objects.live()
    pk_url_kwarg='stockcode'
    template_name='products/notecard.html'
    context_object_name='notecard_product'
  1. 在类视图中重写 get_object 方法,在该方法中,我们可以使用 self.kwargs[self.pk_url_kwarg] 来获取 URL 中的主键值。例如,在以下代码中,我们使用 self.kwargs['stockcode'] 来获取 URL 中的 stockcode:
class NotecardProductListView(ListView):
    queryset=Product.objects.live()
    pk_url_kwarg='stockcode'
    template_name='products/notecard.html'
    context_object_name='notecard_product'

    def get_object(self):
        return Product.objects.get(pk=self.kwargs['stockcode'])
  1. 在类视图中重写 get_context_data 方法,在该方法中,我们可以使用 self.object 来获取当前对象,并使用该对象来获取所需的数据。例如,在以下代码中,我们使用 self.object 来获取产品 ID,并使用该产品 ID 来获取推荐和不推荐该产品的用户列表:
class NotecardProductListView(ListView):
    queryset=Product.objects.live()
    pk_url_kwarg='stockcode'
    template_name='products/notecard.html'
    context_object_name='notecard_product'

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

    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
  1. 在模板中,我们可以使用 {{ object.stockcode }} 来访问 URL 中的 stockcode,也可以使用 {{ liked }}{{ unliked }} 来访问推荐和不推荐该产品的用户列表。

```python
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')
```

在 Django 1.5 中,我们使用类视图来替换函数视图。但是,在类视图中,我们如何访问 URL 变量呢?


**2、解决方案**

在 Django 1.5 的类视图中,我们可以通过以下步骤来访问 URL 变量:

1. 在类视图中定义一个类属性 `pk_url_kwarg`,该属性的值为 URL 中用于标识对象的主键的字段名。例如,在以下代码中,`pk_url_kwarg` 的值为 'stockcode':

```python
class NotecardProductListView(ListView):
    queryset=Product.objects.live()
    pk_url_kwarg='stockcode'
    template_name='products/notecard.html'
    context_object_name='notecard_product'
```

2. 在类视图中重写 `get_object` 方法,在该方法中,我们可以使用 `self.kwargs[self.pk_url_kwarg]` 来获取 URL 中的主键值。例如,在以下代码中,我们使用 `self.kwargs['stockcode']` 来获取 URL 中的 stockcode:

```python
class NotecardProductListView(ListView):
    queryset=Product.objects.live()
    pk_url_kwarg='stockcode'
    template_name='products/notecard.html'
    context_object_name='notecard_product'

    def get_object(self):
        return Product.objects.get(pk=self.kwargs['stockcode'])
```

3. 在类视图中重写 `get_context_data` 方法,在该方法中,我们可以使用 `self.object` 来获取当前对象,并使用该对象来获取所需的数据。例如,在以下代码中,我们使用 `self.object` 来获取产品 ID,并使用该产品 ID 来获取推荐和不推荐该产品的用户列表:

```python
class NotecardProductListView(ListView):
    queryset=Product.objects.live()
    pk_url_kwarg='stockcode'
    template_name='products/notecard.html'
    context_object_name='notecard_product'

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

    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
```

4. 在模板中,我们可以使用 `{{ object.stockcode }}` 来访问 URL 中的 stockcode,也可以使用 `{{ liked }}` 和 `{{ unliked }}` 来访问推荐和不推荐该产品的用户列表。