型号:
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
。
答案 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>