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マッピング:

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ビューは機能しません。車のリストを表示しているように見えるからです。

おそらく 2 つの URL が必要です。1 つは車のリスト用で、もう 1 つは特定の車用です。2 つの異なるビューにマップする必要があります。

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 に答える