Django - 使用自动生成的 URL link 查看 HTML 模板以查看函数时出错
Django - Error when viewing HTML template with autogenerated URL link to view function
我列出了一堆项目,在 HTML 模板中它包含一个 URL link 到单个项目(link 是自动生成的),但我在查看页面时收到此错误:
reverse for 'producer_detail' with arguments '('itemxxx', datetime.datetime(1980, 1, 1, 0, 0, tzinfo=<UTC>))' not found. 1 pattern(s) tried: ['producers/(?P<pk>[^/]+)/\Z']
table 有一个 UniqueConstraint,因为有多个项目具有相同的 owner_name。
owner_name = models.CharField(max_length=12, primary_key=True)
logo_svg = models.CharField(max_length=100, blank=True, null=True)
account_name = models.CharField(max_length=12, blank=True, null=True)
metasnapshot_date = models.DateTimeField(blank=True, null=True)
constraints = [
models.UniqueConstraint(
fields=['owner_name', 'metasnapshot_date'],
name="producer_idx",
)
]
urlpatterns = [
path("", views.producer_index, name="producer_index"),
path("<str:pk>/", views.producer_detail, name="producer_detail"),
]
我的看法
def producer_index(request):
producers = Producer.objects.all()
context = {
'producers': producers
}
print(producers)
return render(request, 'producer_index.html', context)
def producer_detail(request, pk, metasnapshot_date):
producer = Producer.objects.filter(pk=pk,metasnapshot_date=metasnapshot_date)
context = {
'producer': producer
}
return render(request, 'producer_detail.html', context)
我的 HTML 查看所有项目的模板
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>Producers</h1>
<div class="row">
{% for producer in producers %}
<div class="col-md-4">
<div class="card mb-2">
<img class="card-img-top" src="{{ producer.logo_svg }}">
<div class="card-body">
<h5 class="card-title">{{ producer.owner_name }}</h5>
<p class="card-text">{{ producer.url }}</p>
<a href="{% url 'producer_detail' producer.pk producer.metasnapshot_date %}"
class="btn btn-primary">
Read More
</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
HTML 查看单个项目
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>{{ producer.owner_name }}</h1>
<div class="row">
<div class="col-md-8">
<img src="{{ producer.logo_svg }}" alt="" width="100%">
</div>
<div class="col-md-4">
<h5>{{ producer.owner_name }}</h5>
<h5>{{ producer.pk }}</h5>
<h5>{{ producer.url }}</h5>
<br>
<h5>Technology used:</h5>
</div>
</div>
{% endblock %}
我认为的问题:
我猜它没有正确过滤到单个项目。我是 Django 的新手,所以不确定我的视图是否配置正确。
您刚刚忘记传递 metasnapshot_date to the url
改变这个
urlpatterns = [
path("", views.producer_index, name="producer_index"),
path("<str:pk>/", views.producer_detail, name="producer_detail"),
]
到
urlpatterns = [
path("", views.producer_index, name="producer_index"),
path("<str:pk>/<date:metasnapshot_date>/", views.producer_detail, name="producer_detail"),
]
更新
from django.shortcuts import get_object_or_404
def producer_detail(request, pk, metasnapshot_date):
producer = get_object_or_404(Producer,pk=pk,metasnapshot_date=metasnapshot_date)
context = {
'producer': producer
}
return render(request, 'producer_detail.html', context)
我列出了一堆项目,在 HTML 模板中它包含一个 URL link 到单个项目(link 是自动生成的),但我在查看页面时收到此错误:
reverse for 'producer_detail' with arguments '('itemxxx', datetime.datetime(1980, 1, 1, 0, 0, tzinfo=<UTC>))' not found. 1 pattern(s) tried: ['producers/(?P<pk>[^/]+)/\Z']
table 有一个 UniqueConstraint,因为有多个项目具有相同的 owner_name。
owner_name = models.CharField(max_length=12, primary_key=True)
logo_svg = models.CharField(max_length=100, blank=True, null=True)
account_name = models.CharField(max_length=12, blank=True, null=True)
metasnapshot_date = models.DateTimeField(blank=True, null=True)
constraints = [
models.UniqueConstraint(
fields=['owner_name', 'metasnapshot_date'],
name="producer_idx",
)
]
urlpatterns = [
path("", views.producer_index, name="producer_index"),
path("<str:pk>/", views.producer_detail, name="producer_detail"),
]
我的看法
def producer_index(request):
producers = Producer.objects.all()
context = {
'producers': producers
}
print(producers)
return render(request, 'producer_index.html', context)
def producer_detail(request, pk, metasnapshot_date):
producer = Producer.objects.filter(pk=pk,metasnapshot_date=metasnapshot_date)
context = {
'producer': producer
}
return render(request, 'producer_detail.html', context)
我的 HTML 查看所有项目的模板
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>Producers</h1>
<div class="row">
{% for producer in producers %}
<div class="col-md-4">
<div class="card mb-2">
<img class="card-img-top" src="{{ producer.logo_svg }}">
<div class="card-body">
<h5 class="card-title">{{ producer.owner_name }}</h5>
<p class="card-text">{{ producer.url }}</p>
<a href="{% url 'producer_detail' producer.pk producer.metasnapshot_date %}"
class="btn btn-primary">
Read More
</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
HTML 查看单个项目
{% extends "base.html" %}
{% load static %}
{% block page_content %}
<h1>{{ producer.owner_name }}</h1>
<div class="row">
<div class="col-md-8">
<img src="{{ producer.logo_svg }}" alt="" width="100%">
</div>
<div class="col-md-4">
<h5>{{ producer.owner_name }}</h5>
<h5>{{ producer.pk }}</h5>
<h5>{{ producer.url }}</h5>
<br>
<h5>Technology used:</h5>
</div>
</div>
{% endblock %}
我认为的问题:
我猜它没有正确过滤到单个项目。我是 Django 的新手,所以不确定我的视图是否配置正确。
您刚刚忘记传递 metasnapshot_date to the url
改变这个
urlpatterns = [
path("", views.producer_index, name="producer_index"),
path("<str:pk>/", views.producer_detail, name="producer_detail"),
]
到
urlpatterns = [
path("", views.producer_index, name="producer_index"),
path("<str:pk>/<date:metasnapshot_date>/", views.producer_detail, name="producer_detail"),
]
更新
from django.shortcuts import get_object_or_404
def producer_detail(request, pk, metasnapshot_date):
producer = get_object_or_404(Producer,pk=pk,metasnapshot_date=metasnapshot_date)
context = {
'producer': producer
}
return render(request, 'producer_detail.html', context)