Итак, у меня есть список с некоторыми рецептами, и я хочу, чтобы пользователь мог щелкнуть рецепт и был перенаправлен в представление с более подробной информацией. Другими словами, я хочу, чтобы у каждого рецепта был свой URL-адрес. Я пробую этот код, как показано ниже, но он не работает, он перенаправляет сторону 404 после того, как я нажимаю на рецепт.

Моя модель:

class Recipe(models.Model):

  recipe_name = models.CharField(max_length=250)
  preparation = models.CharField(max_length=1000)
  ingredients = models.ManyToManyField(Ingredient)
  recipe_image = models.ImageField(upload_to='images/', default='')


  def __str__(self):
    return self.recipe_name

Посмотреть:

def GenerallView(request):
    lista1 = Recipe.objects.all()
    return render(request, 'drinks/GenerallView.html', {'lista1': lista1})

def DetailView(request, pk):
    lista = get_object_or_404(Recipe, pk=pk)
    return render(request, 'drinks/DetailView.html', {'lista': lista})

URL:

 path('generall_view', views.GenerallView, name='GenerallView'),
 path('detail_view/<int:pk>', views.DetailView, name='DetailView'),

Шаблоны:

Общий вид

<ul>
{% for drink in lista1 %}
    <li><a href="{% url 'DetailView' pk=drink.pk %}">{{ drink.recipe_name }}</a></li>
{% empty %}
    <li>No notes yet.</li>
{% endfor %}
</ul>

Подробный вид

<h1>{{ drink.recipe.name }}</h1>
2
LuiTe 15 Апр 2020 в 22:33

1 ответ

Лучший ответ

Имя объекта - drink и Recipe, поэтому вы должны написать это с помощью {% url 'DetailView drink.pk %}, кроме того, имя вашего представления - DetailView, а не detail_view :

<ul>
{% for drink in lista1 %}
    <li><a href="{% url 'DetailView' drink.pk %}">{{ drink.recipe_name }}</a></li>
{% empty %}
    <li>No notes yet.</li>
{% endfor %}
</ul>

В DetailView вы также передали переменную с именем lista, поэтому вы должны отобразить это с помощью:

<h1>{{ lista.recipe_name }}</h1>
0
Willem Van Onsem 15 Апр 2020 в 20:16