Как решить задачу Reverse для 'Add' с аргументами '('',)' не найден. Проверен 1 шаблон(ы): ['agregar/(?P<producto_id>[0-9]+)/\\\Z'] ошибка?
Я делаю учебник по django и получаю эту ошибку при попытке добавить кнопку href, я использую django 4.0.4 версии и python 3.9 версии.
Models.py
class Producto(models.Model):
serie_producto = models.CharField(max_length=30)
nombre = models.CharField(max_length=30)
codigo = models.CharField(max_length=15)
marca = models.CharField(max_length=30)
precio = models.IntegerField()
created_date = models.DateTimeField(default=timezone.now)
urls.py
...
urlpatterns = [
...
path('agregar/<int:producto_id>/', agregar_producto, name="Add"),
...
]
шаблон catalogo, который вызывает ошибку. Ошибка сообщения выделяет {% url 'Add' producto.id %}
{% for producto in response %}
<div class="col-6">
<div class="card" style="height: 10rem; width: 23rem; margin: 5px 0px;">
<div class="card-body">
<h5 class="card-tittle">{{producto.nombre}}</h5>
<p class="card-text">{{producto.marca}}</p>
<p class="card-text">{{producto.precio}}</p>
<a href="{% url 'Add' producto.id %}" class="btn btn-primary">Agregar al carrito</a>
</div>
</div>
</div>
{% endfor %}
view.py
from tienda.models import Producto
from tienda.carrito import Carrito
def catalogo(request):
url = "http://127.0.0.1:8000/api/Producto/"
response = requests.get(url, auth=('admin','duoc'))
datos = response.json()
return render(request, 'catalogo.html', {'response' : datos })
def agregar_producto(request, producto_id):
carrito = Carrito(request)
producto = Producto.objects.get(id=producto_id)
carrito.agregar(producto)
return redirect("Tienda")
Проблема Когда я перехожу к шаблону catalogo, я получаю вышеупомянутую ошибку, api работает отлично, когда я не использую {% url 'Add' producto.id %}, я думаю, что это что-то с id, не могу прочитать его, может быть??, я не знаю, так ли это. Я понятия не имею, как это решить или что не так.
как я могу это решить?
<РЕДАКТИРОВАНИЕ:
Полное сообщение об ошибке от cmd:
ok ребята я только что нашел ошибку в моей проблеме, я собираюсь разместить здесь для других людей с той же проблемой.
В моем сериализаторе я не указал 'id'
class ProductoSerializer(serializers.HyperlinkedModelSerializer) :
class Meta:
model = Producto
fields = ['url', 'nombre', 'codigo', 'precio', 'serie_producto', 'marca']
Итак, решение следующее:
class ProductoSerializer(serializers.HyperlinkedModelSerializer) :
class Meta:
model = Producto
fields = ['id' #here ,'url', 'nombre', 'codigo', 'precio', 'serie_producto', 'marca']
django.urls.exceptions.NoReverseMatch: Reverse for 'Add' with arguments '('',)' not found. 1 pattern(s) tried: ['agregar/(?P<producto_id>[0-9]+)/\\Z']
Эта ошибка говорит о том, что представление с именем 'Add' ожидает целочисленный аргумент, но вы передали ему пустую строку ''. Чтобы отладить это, вы можете добавить print(datos) перед вызовом render(). Скорее всего, вы увидите список JSON-объектов, по крайней мере один из которых имеет id: "".