【问题标题】:matching django url with views using a model slug使用模型 slug 将 django url 与视图匹配
【发布时间】:2020-12-13 02:35:46
【问题描述】:

我的问题是我无法建立反向匹配,很可能是我的 url 定义有问题(?)。最终我想要做的是:

用户选择“new_pointview”视图保存到数据库中的 2 个位置点。我还定义了一个包含位置信息的唯一 slug,并通过模型中的 save() 将其保存到数据库中。然后用户应该被重定向到一个使用我在上一步中创建的 slug 的 url(观点视图),即 /pointview/slug。代码如下:

models.py

class Points(models.Model):
    starting_point_longitude = models.FloatField(null=True)
    starting_point_latitude = models.FloatField(null=True)
    ending_point_longitude = models.FloatField(null=True)
    ending_point_latitude = models.FloatField(null=True)
    url = models.SlugField(max_length=250, null=True, unique=True, blank=False)


    def save(self, *args, **kwargs):
        self.url = 'start_lon-{0}-start_lat-{1}-end_lon-{2}-end_lat-' \
                   '{3}'.format(self.starting_point_longitude,
                                self.starting_point_latitude,
                                self.ending_point_longitude,
                                self.ending_point_latitude)

        super(Points, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('pointview', kwargs={'url': self.url})

views.py

def pointview(request, url):
    point = get_object_or_404(Points, url=url)
    content = {'starting_point_longitude':
               point.starting_point_longitude,
               'starting_point_latitude':
               point.starting_point_latitude,
               'ending_point_longitude':
               point.ending_point_longitude,
               'ending_point_latitude':
               point.ending_point_latitude}
    
    return render(request, 'points.html', {'user_bundle': content})

def new_pointview(request):
    Points.objects.create(
        starting_point_longitude=request.POST['starting_point_longitude'],
        starting_point_latitude=request.POST['starting_point_latitude'],
        ending_point_longitude=request.POST['ending_point_longitude'],
        ending_point_latitude=request.POST['ending_point_latitude'],
    )

    points_filtered = Points.objects.filter(
        starting_point_longitude=request.POST[
            'starting_point_longitude']).filter(
                starting_point_latitude=request.POST[
                    'starting_point_latitude'])
    unique_url = points_filtered.values()[0]['url']

    return redirect('/pointview/{0}/'.format(unique_url))

urls.py

urlpatterns = [
    path(r'^pointview/(?P<url>[-\w]+)/$', views.pointview, name='pointview'),
    path('^new_pointview/', views.new_pointview, name='new_pointview'),
]

错误: 当前路径 pointview/start_lon-738949.9146592747-start_lat--153698.8751025315-end_lon-759997.8063993475-end_lat--168467.65638300427/ 不匹配任何 URL 模式。希望你能在这里给我一些反馈..

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    为了将来参考,这是一个正则表达式问题,使用以下非直观的正则表达式解决了它:

    url('^pointview/(?P<url>start_lon[--W]+start_lat[--W]+end_lon[--W]+end_lat[--W]+)/', views.pointview, name='pointview')
    

    如果有人可以提供更优雅的解决方案,我会非常有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2013-07-19
      • 2020-08-05
      相关资源
      最近更新 更多