如何在django url路由中解决此类错误,get_object_or_404and slug



如何准确获取URL中指定的系列,但是所有系列的名称都是相同的,它们应该是相同的,但是仅占据系列的URL也就是说,它仅在URL系列中搜索,但不是如何搜索,因此该系列是在URL中指定的系列中,并且在季节中正好是在URL中指定的卷,此处是URL <</p>

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是另一个表的外国键,因此访问字段时,django会自动提供相应表的primary_key。通过查看您的错误,似乎您还没有明确指定slug字段为primary_key,然后由Django提供的自动插入整数字段正在自动尝试与您刚刚提供的slug匹配。我建议访问表中的相应字段,例如serial_of_this_series__slug,IE,slug字段(或任何字段名称为 Serial(,用于查询过滤器。

最新更新