1: Я не думаю, что есть смысл использовать канонический тег, если в любом случае есть 301.
Давайте просто представим сценарий, в котором вы меняете URL-адрес с /q/111/hello-world
на /q/111/foobar
. Движки не будут считать, что они равны, если только они не посещают исходный URL с каноническим тегом, указывающим на /q/111/foobar
(чего не стоит, потому что теперь это 301, разорвав любое доказательство связи между страницами).
2: Я бы сделал это прямым путем. Определите неуникальное поле slug
и сравните его с захваченным URL в подробном представлении.
# models
class MyModel(models.Model):
# ...
non_unique_slug = models.SlugField()
def get_absolute_url(self):
return "/questions/%s/%s" % (self.id, self.non_unique_slug)
# urls
r'^questions/(?P<id>\d+)/(?P<slug>[\w-]+)/$'
# views
def my_view(request, id, slug):
page = Page.objects.get(id=id)
if not slug == page.slug:
return http.HttpResponsePermanentRedirect(page.get_absolute_url())
# render page
return direct_to_template(request, "foobar.html", {'page': page})