Django: перенаправление на внешний URL-адрес, хранящийся в базе данных

#django #django-models #django-views #django-templates

Вопрос:

Я создаю приложение Django. Моя конечная цель состоит в том, чтобы пользователь мог щелкнуть ссылку для перенаправления на внешний сайт. Вот мой код:

models.py

 class Entry(models.Model):
    manufacturer = models.CharField(max_length=255)
    source_url = models.URLField(blank=True)
 

views.py

 def purchase(request, entry_id):
    entry = get_object_or_404(Entry, pk=entry_id)
    return redirect(entry.source_url)
 

entry.html

 {% if user.is_authenticated %}
    <a href="{% url 'purchase' %}">Purchase!</a>
{% endif %}
 

urls.py

 urlpatterns = [
    path('', views.index, name='index'),
    path('entries/<int:entry_id>', views.entry, name='entry'),
]
 

Данные в базе данных выглядят следующим образом:

 id    manufacturer     source_url
1     Mercedes         https://www.mbusa.com/en/home
2     BMW              https://www.bmw.com/en/index.html
3     Audi             https://www.audiusa.com/us/web/en.html
 

Сообщение об ошибке, которое я получаю, выглядит так:

 Exception Value:    
Reverse for 'purchase' not found. 'purchase' is not a valid view function or pattern name.
 

В качестве теста я изменил следующую строку кода:

От: <a href="{% url 'purchase' %}">Go to Source!</a>

Для: <a href="www.google.com">Go to Source!</a>

Это устранило ошибку «обратного», но созданный ею URL-адрес был:

 http://127.0.0.1:8000/entries/www.google.com
 

Является ли «обратная» ошибка вызвана отсутствием URL-адреса для «покупки» в urls.py ? Если да, то как бы я это определил?

Заранее спасибо за помощь этому новичку в Джанго!

Ответ №1:

Для перенаправления из поля зрения вы можете сделать:

 from django.http import HttpResponseRedirect
def purchase(request, entry_id):
    entry = get_object_or_404(Entry, pk=entry_id)
    return HttpResponseRedirect(entry.source_url)
 

и вы можете решить <a href="www.google.com">Go to Source!</a> проблему с помощью:

 <a href="http://www.google.com">Go to Source!</a>
 

entry.html

 {% if user.is_authenticated %}
    <a href="{% url 'purchase' entry_id %}">Purchase!</a>
{% endif %}
 

здесь entry_id будет основной ключ вашей таблицы ввода.

urls.py

 urlpatterns = [
    path('', views.index, name='index'),
    path('entries/<int:entry_id>', views.entry, name='entry'),
    path('purchase/<int:entry_id>', views.purchase, name='purchase'),
]
 

Комментарии:

1. Джафур, спасибо тебе за предложение. К сожалению, я вижу то же самое сообщение об ошибке: Reverse for 'purchase' not found. 'purchase' is not a valid view function or pattern name.

2. @невозмутимость вы проверили, что ваш source_url файл содержит http или https в начале? Это работает на меня для вышеупомянутого решения.

3. Значения source_url полей содержат https . Например: https://unagiscooters.com/products/the-scooter/

4. разве вы не создали ничего url для purchase функции?

5. Вы имеете в виду, что мне нужно создать url для purchase() функции в urls.py файле?