get_absolute_url在Django中不起作用

时间:2012-12-31 13:27:53

标签: django

型号:

class Car(models.Model):
    name = models.CharField(max_length=10, unique=True)
    def __unicode__(self):
            return self.name
    def get_absolute_url(self):
        return reverse('cars.views.car', args=[str(self.id)])

查看:

def car(request):
    all_cars = Car.objects.all().filter(active=1).values('id', 'name')
    return render(request, 'car.html', {'all_cars': all_cars})

网址映射:

url(r'^car/$', 'cars.views.car'),

car.html中,我正在使用:

<li><a href="{{ car.get_absolute_url }}">{{ car.name }}</a></li>

但它没有打印/ car / N /,只有/ car /。怎么解决?使用this<!-- BAD template code. Avoid! -->)可行,但不适用于get_absolute_url

2 个答案:

答案 0 :(得分:3)

您的网址格式不接受任何参数,因此django无法使用参数生成网址!

url(r'^car/$', 'cars.views.car'), # Where would django add the parameter?!

应该是:

url(r'^car/(?P<car_id>\d+)/$', 'cars.views.car'),

但是你的car视图不起作用,因为它看起来像是列出了汽车列表。

您可能需要两个URL:一个用于汽车列表,一个用于特定汽车。他们需要映射到两个不同的视图:

url(r'^car/$', 'cars.views.list_cars'), # List of all cars.
url(r'^car/(?P<car_id>\d+)/$', 'cars.views.view_car'), # View a specific car, map get_aboluste_url to this view. 

在旁注中,您应该研究generic views,他们会使整个过程更简单。

答案 1 :(得分:0)

您可以拥有一个可以完全满足所有要求的网址,但这取决于模板的结构(如何扩展子模板)。让它工作:

url(r'^car/(?:(?P<car_id>\d+)/)?$', 'cars.views.car', name="car_url"),
# you notice i have make car_id optional

现在你的观点应该是:

def car(request, car_id=None):
    if car_id:
        # just get a single car
        all_cars = Car.objects.filter(active=1, pk=car_id).values('id', 'name')
    else:
        # get all cars
        all_cars = Car.objects.filter(active=1).values('id', 'name')
    return render(request, 'car.html', {'all_cars': all_cars})

在模板中使用url tag获取网址解析:

<li><a href="{% url car_url car_id=car.id %}">{{ car.name }}</a></li>

对于列出网址,请不要传递car_id

<li><a href="{% url car_url %}">Browse Cars</a></li>