鼻涕虫没有出现在url中



我希望我的slugs显示在我的url中,而不是正在查看的图像的编号ID。我好像怎么也弄不动。有人能指出我遗漏/做错了什么吗?TYIA

models.py:

class PostImage(models.Model):
image = models.ImageField(null=False, blank=False, upload_to="images", default="default.png")
image_title = models.CharField(max_length=100, null=False, blank=False, default="")
slug = models.SlugField(null=True)
def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.title)
super().save(*args, **kwargs)

def __str__(self):
return self.image_title

class Meta:
verbose_name_plural = 'PostImage'

views.py:

def galleryPage(request):
images = PostImage.objects.all()
context = {'images':images}
return render(request, 'gallery.html', context)

def viewImage(request, slug):
photo = PostImage.objects.get(id=slug)
return render(request, 'viewimage.html', {'photo': photo, 'slug': slug})

urls . py:

path('viewimage/<slug:slug>/', views.viewImage, name='viewimage'),

admin.py:

@admin.register(PostImage)
class PostAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('image_title',)}

这些是html页面,第一个是图像被点击的地方,第二个是图像被显示的地方,也是我想要在浏览器的URL中显示的地方,而不是id/编号。

html:

</head>
<body>
<header>{% include 'navbardesktop.html' %}</header>
<div class="container-gallery">
<div class="col-md-12" id="gallerygrid1">
<div class="row">
{% for photo in images %}
<div class="col-md-4" id="gallerygrid2">
<a href="{% url 'viewimage' photo.id %}"
><img
class="gallery-thumbnail"
src="{{photo.image.url}}"
style=""
/></a>
</div>
{% empty %}
<h3>No Projects...</h3>
{% endfor %}
</div>
</div>
</div>
</body>
</html>

html:

</head>
<body>
<header>{% include 'navbardesktop.html' %}</header>
<div class="image-container">
<div class="image-post">
<a href="{% url 'gallery' %}"
><img class="photo-img" src="{{photo.image.url}}"
/></a>
<h2 class="photo-title">{{photo.image_title}}</h2>
<p class="contact">
Interested in purchasing this as a print? Contact me for more
information regarding price and sizes.
</p>
<a href="{% url 'contact' %}" class="btn btn-secondary" type="button"
>Contact</a
>
<a href="{% url 'gallery' %}" class="btn btn-secondary" type="button"
>Gallery</a
>
</div>
</div>
</body>
</html>

简短回答
打开带有图像的页面的url是<a href="{% url 'viewimage' photo.id %}">,并且由于您在photo.id中馈送,因此这就是您得到的。你可以把它改成<a href="{% url 'viewimage' photo.slug %}">,这样问题就解决了。


但是这会产生问题,因为您允许slug字段的null=True,那么当您有一个没有slugPostImage实例时会发生什么?一个错误,因为你的url是期望一个参数,<slug:slug>:

path('viewimage/<slug:slug>/', views.viewImage, name='viewimage'),

我不明白为什么您需要使空格字段为空,因为您有一个save()函数将自动填充它,尽管我相信它确实有一个错别字,那就是slugify(self.title)self.title是什么?也许你指的是self.image_title?:

class PostImage(models.Model):
image = models.ImageField(null=False, blank=False, upload_to="images", default="default.png")
image_title = models.CharField(max_length=100, null=False, blank=False, default="")
slug = models.SlugField()
def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.image_title)
super().save(*args, **kwargs)
...

不幸的是
不幸的是,在您的视图中仍然会出现一些问题,因为您试图获得photo = PostImage.objects.get(slug=slug),但现在slug将是一个实际的蛞蝓,而不是id。易于修复:

def viewImage(request, slug):
photo = PostImage.objects.get(slug=slug)
return render(request, 'viewimage.html', {'photo': photo, 'slug': slug})

因为你不应该在没有检查是否可以完成的情况下尝试获取一个对象:

def viewImage(request, slug):
try:
photo = PostImage.objects.get(slug=slug)
except PostImage.DoesNotExist:
print("PostImage with this slug does not exist")
photo = None
return render(request, 'viewimage.html', {'photo': photo, 'slug': slug})

最新更新