В Django, как мне разобраться с "или" в регулярном выражении URL, как только я доберусь до представления? - PullRequest
0 голосов
/ 08 августа 2011

Я только изучаю Django и застреваю с некоторой логикой URL. Я пытаюсь разрешить или имя категории или идентификатор в URL:

...
url(r'^(?P<booze_q>\w+|\d+)/$','glasses.views.booze'),
...

А потом, с точки зрения thew, иметь дело с этим результатом только один раз. Однако, если URL является строкой - в этом случае Whiskey, я получаю сообщение об ошибке при попытке передать строку, где ожидается int. Это самое близкое, что я получил до сих пор:

def booze(request, booze_q):
    booze = get_object_or_404(Booze,Q(pk=booze_q)|Q(name=booze_q))
    return render_to_response('booze/detail.html', {'booze': booze})

Но это возвращает ошибку: invalid literal for int() with base 10: 'Whiskey'

Я уверен, что это довольно легко, но это мое первое приложение Django, поэтому любая помощь будет принята с благодарностью.

tl; dr : Конечный результат, я бы хотел, чтобы mysite.com/1/ или mysite.com/Whiskey/ оба вызывали представление glasses.views.booze и получали объект с id=1 или name=Whiskey

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Это распространенный сценарий, с которым вы сталкиваетесь довольно часто, и обычно он обрабатывается путем обращения к нескольким аргументам, а представления ведут себя по-разному в зависимости от того, какие из аргументов представления присутствуют или нет.

Сначала вы определяете шаблон URL, который уникально соответствует каждому конкретному случаю, а затем позволяете распознавателю URL Django устанавливать аргументы в зависимости от того, какой из шаблонов был сопоставлен.

Вот пример с представлением на основе классов, которое выполняет два разных запроса в зависимости от того, какой из двух аргументов ключевого слова, booze_id или booze_name, установлен:

url(r'^(?P<booze_id>\d+)/$', BoozeDetailView.as_view()),
url(r'^(?P<booze_name>\w+)/$', BoozeDetailView.as_view()),

class BoozeDetailView(DetailView):

    model = Booze

    def get_object(self):
        booze_id = self.kwargs.get('booze_id', None)
        booze_name = self.kwargs.get('booze_name', None)

        if booze_id:
            return self.model.objects.get(id=booze_id)
        else:
            return self.model.objects.get(name=booze_name)
0 голосов
/ 08 августа 2011

Вы всегда получите строку, даже если строка содержит число.

1) Вы должны не иметь параметр, который может быть либо идентификатором, либо чем-то еще.Однажды вы введете элемент, имя которого является числом, и ваше приложение не будет работать.

2) При запросе pk со строкой django автоматически пытается преобразовать ее в целое число.Вам придется обработать случай не-pk перед построением этого запроса.

...