【问题标题】:error with slug in django - template it show all posts data in each postdjango中的slug错误-模板显示每个帖子中的所有帖子数据
【发布时间】:2021-01-13 05:17:49
【问题描述】:

Django 中的 slug 错误 - 模板显示每个帖子中的所有帖子数据 当我创建一个新帖子并写入我的数据时,它会显示来自其他帖子的所有数据,这是为什么呢? 以及如何解决?

also how I can add an auto-generation slug?

models.py:

from django.urls import reverse
from django.utils.text import slugify

class Android(models.Model):
    title = models.CharField(max_length=50,default="",help_text="this is title for slug not post!")
    name = models.CharField(max_length=50,default="")
    app_contect = models.CharField(max_length=240,default="")
    app_image = models.ImageField(upload_to='images/',null=True, blank=True)
    post_date = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    post_tag = models.CharField(max_length=50,default="",choices = BLOG_SECTION_CHOICES)
    slug = models.SlugField(null=True,uniqe=True) # new
    def get_absolute_url(self):
        return reverse('android_posts', kwargs={'slug': self.slug}) # new


    def get_image(self):
        if self.app_image and hasattr(self.app_image, 'url'):
            return self.app_image.url
        else:
            return '/path/to/default/image'

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('-post_date',)

views.py:

def android_posts(request,slug):
    android_posts = Android.objects.all()
    context = {'android_posts':android_posts}
    return render(request,'android/android_problems_fix.html', { 'android_posts': android_posts })

html页面:

 {% for android in android_posts %}
 <h1 id="font_control_for_header_in_all_pages">{{android.name}}</h1>
 <hr>
 <p id="font_control_for_all_pages">{{android.app_contect}}</p>
 {% endfor %}

网址:

path('Android/<slug:slug>', views.android_posts, name='android_posts'),

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    要自动生成您的 slug(并且仅在初始保存时执行,以便保持一致),请将生成添加到您的模型 save 方法:

    def save(self, *args, **kwargs):
        super(<Model>, self).save(*args, **kwargs)
        if not self.pk:
            self.slug = <slugify code here>
    

    至于您的视图/模板,您正在使用以下方式专门选择所有帖子:

    android_posts = Android.objects.all()
    

    将它们传递给模板,然后用for 循环遍历它们以显示它们。

    而不是这个,只选择一个对象:

    android_post = Android.object.get(pk=<pk value>)
    

    在添加 urls.py 后进行编辑:

    您可以通过以下方式获取 slug 的唯一对象:

    android_post = get_object_or_404(Android, slug=slug)
    

    get_object_or_404 的使用也将处理该记录不存在的情况。


    你还没有发布你的urls.py,所以不确定你是如何链接到这个视图的,但是如果它在 url 中包含 slug,你将能够在视图中得到它。我的猜测是您不是通过 url 中的 slug 访问,而是通过 id 字段访问。

    就个人而言,当我对一些文本进行 slugify 时,我总是包含id - 这是确保唯一性的更好方法。通过在非 pk slug 字段中指定 unique=True,您可能会限制人们可以使用的头衔(那时两个人不能使用相同的头衔!)

    举个例子,这就是我在我的一个模型上的做法:

    def save(self, *args, **kwargs):
        if not self.id or not self.slug:
            super(Android, self).save(*args, **kwargs)
            self.slug = slugify(f"{self.title} {str(self.id)}")
        super(Android, self).save(*args, **kwargs)
    

    此 slug 将始终是唯一的,因为它包含 id - 并且 2 个人可以拥有具有相同 title 值的记录,而无需系统反对。

    【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多