在 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 变量:
- 在类视图中定义一个类属性
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'
- 在类视图中重写
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'])
- 在类视图中重写
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
- 在模板中,我们可以使用
{{ 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 }}` 来访问推荐和不推荐该产品的用户列表。