0

模型:

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/。如何解决?有了这个( <!-- BAD template code. Avoid! -->) 它可以工作,但不能与get_absolute_url.

4

2 回答 2

3

您的 URL 模式不接受任何参数,因此 django 无法生成带有参数的 URL!

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. 

在旁注中,您应该查看通用视图,它们会使整个过程更简单。

于 2012-12-31T13:31:39.073 回答
0

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

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 标签进行 url 解析:

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

对于列表 url,请不要通过car_id

<li><a href="{% url car_url %}">Browse Cars</a></li>
于 2012-12-31T14:39:34.733 回答