Django 中的自定义 url 模式
custom url patterns in Django
我有一个我正在尝试建立供个人使用的网站,它有两个 ID,一个用于会议(比赛是 运行),一个用于活动(比赛号码)。事件id采用“123456_01”的形式,在模型中作为Event模型的主键传递,如下所示...
class Event(models.Model):
meeting = models.CharField(max_length=500)
meetingID = models.ForeignKey(Meeting, on_delete='CASCADE', related_name='races')
eventID = models.CharField(max_length=300, primary_key=True)
venue = models.CharField(max_length=600, null=True)
race_no = models.CharField(max_length=2)
event_time = models.TimeField()
status = models.CharField(max_length=100)
distance = models.CharField(max_length=600)
我目前的视图文件设置如下:
class EventDetailView(DetailView,LoginRequiredMixin):
context_object_name = 'race_detail'
template_name = 'event.html'
model = models.Event
slug_url_kwarg = 'eventID'
我还设置了前端,现在当我点击某场比赛时,它会自动导航到带有 link http://127.0.0.1:8000/app/123456_01/ 的页面,因此该部分正在运行此配置在 HTML:
{% url 'bettingUI:race' eventID=events.eventID %}
我似乎遇到的问题是 urls.py 文件的配置以及 views.py 文件中可能缺少的内容。
我的urls.py文件设置如下:
from django.urls import path, include
from . import views
app_name = 'bettingUI'
urlpatterns = [
path('',views.DashListView.as_view(),name='dashboard'),
path('<eventID>/', views.EventDetailView.as_view(), name='race'),
]
我通过阅读文档认为我需要使用 slug,因为我传入的 ID 中有“_”字符,但我在浏览器中不断收到错误消息,指出它无法解析关键字 'slug'进场。选项有:dro_eventID、dro_meetingID、dro_meetingID_id、event_time、会议、race_no、运行人员、状态、地点(**the模型的字段)。如果我将 urls.py 文件更改为以下内容,我会得到同样的错误:
path('<slug:eventID>/', views.EventDetailView.as_view(), name='race'),
我在这里有点迷路所以希望得到一些指导。
谢谢。
我算出来了,答案是输入<slug:pk>
但现在我的仪表板页面(我点击进入比赛页面的页面)出现错误:
NoReverseMatch at /app/
Reverse for 'race' with keyword arguments '{'eventID': '1216859_01'}' not found. 1 pattern(s) tried: ['app/(?P<pk>[-a-zA-Z0-9_]+)/$']
所以我现在再给它一个工作版本:
首先,您应该向您的事件模型添加一个 slug
字段,这样您就可以使用 slug,因此您的模型将如下所示:
from django.utils.text import slugify
class Event(models.Model):
meeting = models.CharField(max_length=500)
meetingID = models.ForeignKey(Meeting, on_delete='CASCADE', related_name='races')
eventID = models.CharField(max_length=300, primary_key=True)
venue = models.CharField(max_length=600, null=True)
race_no = models.CharField(max_length=2)
event_time = models.TimeField(null=True)
status = models.CharField(max_length=100, null=True)
distance = models.CharField(max_length=600, null=True)
slug = models.SlugField(max_length=50, null=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.eventID, allow_unicode=True)
return super(Event, self).save(*args, **kwargs)
注意 save()
函数,其中我们添加了一个 slugify() 方法来在事件保存时对 eventID 字段进行 slugify。
那么您的观看次数应该如下所示:
from .models import Event, Meeting
class EventList(ListView):
model = Event
template_name = 'event_list.html'
context_object_name = 'race_list'
class EventDetailView(DetailView,LoginRequiredMixin):
context_object_name = 'race_detail'
template_name = 'myusers1/event.html' # this could be only event.html if the template is in yourapp/templates/ folder directly
model = Event
slug_url_kwarg = 'slug'
请注意,在上面的视图中,我们现在实际使用 默认的 slug 定义。
我把列表视图 url 放在 races/
sub-url 下,但你可以把它放在任何你想放的地方。在您的 urls.py 中,您现在可以正确使用 slug
值,例如:
path('races/<slug:slug>/', views.EventDetailView.as_view(), name='race'),
path('races/', views.EventList.as_view(), name='race_list'),
在我的试用应用程序中,模板如下所示:列表视图模板:
{% extends 'myusers1/base.html' %}
{% block content %}
<div class"container">
<div class="col col-lg-2">
<h2>Races</h2>
<ul>
{% for race in race_list %}
<div class="col-xs-12 .col-md-8"><li><a href="{% url 'Myusers1:race' slug=race.slug %}"> {{ race.venue }} </a> </li></div>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
详细信息模板如下所示:
{% extends 'myusers1/base.html' %}
{% block content %}
<div class"container">
<div class="col col-lg-2">
<h2>Race Details</h2>
<div class="col-xs-12 .col-md-8"> <h4>Venue name: </h4> {{ race_detail.venue}} </div>
<div class="col-xs-12 .col-md-8"> <h4>Event ID: </h4> {{ race_detail.eventID }} </div>
<div class="col-xs-12 .col-md-8"> <h4>Meeting name: </h4> {{ race_detail.meeting }} </div>
<div class="col-xs-12 .col-md-8"> <h4>Meeting ID: </h4> {{ race_detail.meetingID.id }} </div>
</div>
</div>
{% endblock %}
以及关于动态 urls 如何使用上述方法工作的视觉结果:
希望以上内容能帮助您现在完成您的应用列表和详细信息视图。干杯。
我想我在这里找到了解决方案试试这个:
url.py:
path('<slug:eventID>/', views.EventDetailView.as_view(), name='race')
现在您可以使用 get_object 方法在您的 EventDetailView
通用视图中简单地获取 Event
的实例,如下所示:
class EventDetailView(DetailView, LoginRequiredMixin):
context_object_name = 'race_detail'
template_name = 'event.html'
model = models.Event
def get_object(self):
e1 = Event.objects.get(eventID=self.kwargs['eventID'])
print (e1.eventID) # or e1.pk gives: 123456_01
return e1
您还可以将 eventID
从 CharField
更改为 SlugField
。并且仍然有效。
我有一个我正在尝试建立供个人使用的网站,它有两个 ID,一个用于会议(比赛是 运行),一个用于活动(比赛号码)。事件id采用“123456_01”的形式,在模型中作为Event模型的主键传递,如下所示...
class Event(models.Model):
meeting = models.CharField(max_length=500)
meetingID = models.ForeignKey(Meeting, on_delete='CASCADE', related_name='races')
eventID = models.CharField(max_length=300, primary_key=True)
venue = models.CharField(max_length=600, null=True)
race_no = models.CharField(max_length=2)
event_time = models.TimeField()
status = models.CharField(max_length=100)
distance = models.CharField(max_length=600)
我目前的视图文件设置如下:
class EventDetailView(DetailView,LoginRequiredMixin):
context_object_name = 'race_detail'
template_name = 'event.html'
model = models.Event
slug_url_kwarg = 'eventID'
我还设置了前端,现在当我点击某场比赛时,它会自动导航到带有 link http://127.0.0.1:8000/app/123456_01/ 的页面,因此该部分正在运行此配置在 HTML:
{% url 'bettingUI:race' eventID=events.eventID %}
我似乎遇到的问题是 urls.py 文件的配置以及 views.py 文件中可能缺少的内容。
我的urls.py文件设置如下:
from django.urls import path, include
from . import views
app_name = 'bettingUI'
urlpatterns = [
path('',views.DashListView.as_view(),name='dashboard'),
path('<eventID>/', views.EventDetailView.as_view(), name='race'),
]
我通过阅读文档认为我需要使用 slug,因为我传入的 ID 中有“_”字符,但我在浏览器中不断收到错误消息,指出它无法解析关键字 'slug'进场。选项有:dro_eventID、dro_meetingID、dro_meetingID_id、event_time、会议、race_no、运行人员、状态、地点(**the模型的字段)。如果我将 urls.py 文件更改为以下内容,我会得到同样的错误:
path('<slug:eventID>/', views.EventDetailView.as_view(), name='race'),
我在这里有点迷路所以希望得到一些指导。
谢谢。
我算出来了,答案是输入<slug:pk>
但现在我的仪表板页面(我点击进入比赛页面的页面)出现错误:
NoReverseMatch at /app/
Reverse for 'race' with keyword arguments '{'eventID': '1216859_01'}' not found. 1 pattern(s) tried: ['app/(?P<pk>[-a-zA-Z0-9_]+)/$']
所以我现在再给它一个工作版本:
首先,您应该向您的事件模型添加一个 slug
字段,这样您就可以使用 slug,因此您的模型将如下所示:
from django.utils.text import slugify
class Event(models.Model):
meeting = models.CharField(max_length=500)
meetingID = models.ForeignKey(Meeting, on_delete='CASCADE', related_name='races')
eventID = models.CharField(max_length=300, primary_key=True)
venue = models.CharField(max_length=600, null=True)
race_no = models.CharField(max_length=2)
event_time = models.TimeField(null=True)
status = models.CharField(max_length=100, null=True)
distance = models.CharField(max_length=600, null=True)
slug = models.SlugField(max_length=50, null=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.eventID, allow_unicode=True)
return super(Event, self).save(*args, **kwargs)
注意 save()
函数,其中我们添加了一个 slugify() 方法来在事件保存时对 eventID 字段进行 slugify。
那么您的观看次数应该如下所示:
from .models import Event, Meeting
class EventList(ListView):
model = Event
template_name = 'event_list.html'
context_object_name = 'race_list'
class EventDetailView(DetailView,LoginRequiredMixin):
context_object_name = 'race_detail'
template_name = 'myusers1/event.html' # this could be only event.html if the template is in yourapp/templates/ folder directly
model = Event
slug_url_kwarg = 'slug'
请注意,在上面的视图中,我们现在实际使用 默认的 slug 定义。
我把列表视图 url 放在 races/
sub-url 下,但你可以把它放在任何你想放的地方。在您的 urls.py 中,您现在可以正确使用 slug
值,例如:
path('races/<slug:slug>/', views.EventDetailView.as_view(), name='race'),
path('races/', views.EventList.as_view(), name='race_list'),
在我的试用应用程序中,模板如下所示:列表视图模板:
{% extends 'myusers1/base.html' %}
{% block content %}
<div class"container">
<div class="col col-lg-2">
<h2>Races</h2>
<ul>
{% for race in race_list %}
<div class="col-xs-12 .col-md-8"><li><a href="{% url 'Myusers1:race' slug=race.slug %}"> {{ race.venue }} </a> </li></div>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
详细信息模板如下所示:
{% extends 'myusers1/base.html' %}
{% block content %}
<div class"container">
<div class="col col-lg-2">
<h2>Race Details</h2>
<div class="col-xs-12 .col-md-8"> <h4>Venue name: </h4> {{ race_detail.venue}} </div>
<div class="col-xs-12 .col-md-8"> <h4>Event ID: </h4> {{ race_detail.eventID }} </div>
<div class="col-xs-12 .col-md-8"> <h4>Meeting name: </h4> {{ race_detail.meeting }} </div>
<div class="col-xs-12 .col-md-8"> <h4>Meeting ID: </h4> {{ race_detail.meetingID.id }} </div>
</div>
</div>
{% endblock %}
以及关于动态 urls 如何使用上述方法工作的视觉结果:
希望以上内容能帮助您现在完成您的应用列表和详细信息视图。干杯。
我想我在这里找到了解决方案试试这个:
url.py:
path('<slug:eventID>/', views.EventDetailView.as_view(), name='race')
现在您可以使用 get_object 方法在您的 EventDetailView
通用视图中简单地获取 Event
的实例,如下所示:
class EventDetailView(DetailView, LoginRequiredMixin):
context_object_name = 'race_detail'
template_name = 'event.html'
model = models.Event
def get_object(self):
e1 = Event.objects.get(eventID=self.kwargs['eventID'])
print (e1.eventID) # or e1.pk gives: 123456_01
return e1
您还可以将 eventID
从 CharField
更改为 SlugField
。并且仍然有效。