如何修复 Django url-routing, get_object_or_404and Slug 中的此类错误?
How to fix such an error in Django url-routing, get_object_or_404and Slug?
如何准确获取URL中指定的系列,但是所有系列的名字都是一样的,应该是一样的,但是只需要URL系列本身,也就是说,它仅搜索 URL 系列,而不是搜索方式,因此该系列在 URL 中指定的系列中,并且在季节中也恰好是音量在URL这里指定的是url
Url 工作正常,但我无法转到正确的系列!
urlpatterns = [
url(r'^$', homeview, name='homeview'),
url(r'^subscribe/$', validate_email, name='subscribe'), # /series/
url(r'^(?P<serial_slug>[\w-]+)/$', post_of_serial, name='post_of_serial'), # /series/Prison_Break/
url(r'^(?P<serial_slug>[\w-]+)/(?P<season_slug>[\w-]+)/$', post_of_season, name='post_of_season'), # /series/Prison_Break/season_5/
url(r'^(?P<serial_slug>[\w-]+)/(?P<season_slug>[\w-]+)/(?P<series_slug>[\w-]+)/$', post_of_serie, name='post_of_serie'), # /series/Prison_Break/season_5/2/
]
型号
class Series(models.Model):
id = models.AutoField(primary_key=True)
rus_name = models.CharField(max_length=60)
eng_name = models.CharField(max_length=60)
slug = models.SlugField(unique=False)
serial_of_this_series = models.ForeignKey(Serial, on_delete=models.CASCADE, default=True)
season_of_this_series = models.ForeignKey(Season, on_delete=models.CASCADE, default=True)
number_of_series = models.IntegerField(default=0, blank=True, null=True)
description = models.TextField(max_length=700, blank=True, default=None)
size_of_torent_file = models.CharField(max_length=60, default=None)
link_for_dowloand_serie_in_quality_360p = models.CharField(max_length=60, default=None)
link_for_dowloand_serie_in_quality_720p = models.CharField(max_length=60, default=None)
link_for_dowloand_serie_in_quality_1080p = models.CharField(max_length=60, default=None)
rating = models.FloatField(default=0, blank=True)
is_active = models.BooleanField(default=True)
timestamp_rus = models.DateField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
timestamp_eng = models.CharField(max_length=60)
time_of_series = models.DecimalField(max_digits=10, decimal_places=2, default=42)
def get_absolute_url(self):
return reverse('series:post_of_serie', kwargs=
{'serial_slug': self.serial_of_this_series.slug,
'season_slug': self.season_of_this_series.slug,
'series_slug': self.slug})
def __str__(self):
return "%s | %s" % (self.rus_name, self.number_of_series)
class Meta:
ordering = ["-timestamp_rus"]
verbose_name = 'Series'
verbose_name_plural = 'Series'
views.py
def post_of_serie(request, serial_slug=None, season_slug=None, series_slug=None):
serie = get_object_or_404(Series, serial_of_this_series=serial_slug, season_of_this_series=season_slug, slug=series_slug)
#series_2 = Series.objects.filter(serial_of_this_series=serial_slug, season_of_this_series=season_slug, slug=series_slug )
context = {"serie":serie,}
return render(request, 'series.html', context)
以上版本错误
ValueError at /series/Colony/Season_1/episode_1/
invalid literal for int() with base 10: 'Colony'
也有这样的选项,但是出现这样的错误,这样的名称已经存在。其实剧名和季名应该是一样的!
def post_of_serie(request, serial_slug=None, season_slug=None, series_slug=None):
serie = get_object_or_404(Series, slug=series_slug)
context = {"serie":serie,}
return render(request, 'series.html', context)
尝试像这样编辑您的视图,
def post_of_serie(request, serial_slug=None, season_slug=None, series_slug=None):
serie = get_object_or_404(Series, serial_of_this_series__slug=serial_slug, season_of_this_series__slug=season_slug, slug=series_slug)
context = {"serie":serie,}
return render(request, 'series.html', context)
serial_of_this_series
是另一个table的ForeignKey,所以在访问该字段时,django会自动提供对应table的primary_key。通过查看您的错误,您似乎没有明确地将 slug
字段指定为 primary_key,然后 django 自动提供的自动递增整数字段正在尝试与 slug 匹配你刚刚提供。我建议访问 table 中的相应字段,例如 serial_of_this_series__slug
,即 Serial
table 中的 slug
字段(或任何字段名称) ] 用于查询过滤。
如何准确获取URL中指定的系列,但是所有系列的名字都是一样的,应该是一样的,但是只需要URL系列本身,也就是说,它仅搜索 URL 系列,而不是搜索方式,因此该系列在 URL 中指定的系列中,并且在季节中也恰好是音量在URL这里指定的是url
Url 工作正常,但我无法转到正确的系列!
urlpatterns = [
url(r'^$', homeview, name='homeview'),
url(r'^subscribe/$', validate_email, name='subscribe'), # /series/
url(r'^(?P<serial_slug>[\w-]+)/$', post_of_serial, name='post_of_serial'), # /series/Prison_Break/
url(r'^(?P<serial_slug>[\w-]+)/(?P<season_slug>[\w-]+)/$', post_of_season, name='post_of_season'), # /series/Prison_Break/season_5/
url(r'^(?P<serial_slug>[\w-]+)/(?P<season_slug>[\w-]+)/(?P<series_slug>[\w-]+)/$', post_of_serie, name='post_of_serie'), # /series/Prison_Break/season_5/2/
]
型号
class Series(models.Model):
id = models.AutoField(primary_key=True)
rus_name = models.CharField(max_length=60)
eng_name = models.CharField(max_length=60)
slug = models.SlugField(unique=False)
serial_of_this_series = models.ForeignKey(Serial, on_delete=models.CASCADE, default=True)
season_of_this_series = models.ForeignKey(Season, on_delete=models.CASCADE, default=True)
number_of_series = models.IntegerField(default=0, blank=True, null=True)
description = models.TextField(max_length=700, blank=True, default=None)
size_of_torent_file = models.CharField(max_length=60, default=None)
link_for_dowloand_serie_in_quality_360p = models.CharField(max_length=60, default=None)
link_for_dowloand_serie_in_quality_720p = models.CharField(max_length=60, default=None)
link_for_dowloand_serie_in_quality_1080p = models.CharField(max_length=60, default=None)
rating = models.FloatField(default=0, blank=True)
is_active = models.BooleanField(default=True)
timestamp_rus = models.DateField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
timestamp_eng = models.CharField(max_length=60)
time_of_series = models.DecimalField(max_digits=10, decimal_places=2, default=42)
def get_absolute_url(self):
return reverse('series:post_of_serie', kwargs=
{'serial_slug': self.serial_of_this_series.slug,
'season_slug': self.season_of_this_series.slug,
'series_slug': self.slug})
def __str__(self):
return "%s | %s" % (self.rus_name, self.number_of_series)
class Meta:
ordering = ["-timestamp_rus"]
verbose_name = 'Series'
verbose_name_plural = 'Series'
views.py
def post_of_serie(request, serial_slug=None, season_slug=None, series_slug=None):
serie = get_object_or_404(Series, serial_of_this_series=serial_slug, season_of_this_series=season_slug, slug=series_slug)
#series_2 = Series.objects.filter(serial_of_this_series=serial_slug, season_of_this_series=season_slug, slug=series_slug )
context = {"serie":serie,}
return render(request, 'series.html', context)
以上版本错误
ValueError at /series/Colony/Season_1/episode_1/ invalid literal for int() with base 10: 'Colony'
也有这样的选项,但是出现这样的错误,这样的名称已经存在。其实剧名和季名应该是一样的!
def post_of_serie(request, serial_slug=None, season_slug=None, series_slug=None):
serie = get_object_or_404(Series, slug=series_slug)
context = {"serie":serie,}
return render(request, 'series.html', context)
尝试像这样编辑您的视图,
def post_of_serie(request, serial_slug=None, season_slug=None, series_slug=None):
serie = get_object_or_404(Series, serial_of_this_series__slug=serial_slug, season_of_this_series__slug=season_slug, slug=series_slug)
context = {"serie":serie,}
return render(request, 'series.html', context)
serial_of_this_series
是另一个table的ForeignKey,所以在访问该字段时,django会自动提供对应table的primary_key。通过查看您的错误,您似乎没有明确地将 slug
字段指定为 primary_key,然后 django 自动提供的自动递增整数字段正在尝试与 slug 匹配你刚刚提供。我建议访问 table 中的相应字段,例如 serial_of_this_series__slug
,即 Serial
table 中的 slug
字段(或任何字段名称) ] 用于查询过滤。