Opened 3 years ago

Closed 3 years ago

#32207 closed Bug (invalid)

Slug field is accepting whitespace when entered through Django shell.

Reported by: Harshvardhan Anand Owned by: nobody
Component: Database layer (models, ORM) Version: 3.1
Severity: Normal Keywords: slug; prepopulated; error reporting; sqlite
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

I am using Django 3.1.3 with Python 3.7.6.

  1. Slug field is accepting whitespaces when updated from Django shell.
  2. Slug field is not prepopulated if data(like title) is entered from Django shell.

But if slug is entered with whitespaces from admin panel then it will raise error. And similarly if we create data(e.g. - title) from admin panel slug field is prepopulated.

I have also created a video(saved in google drive) explaining the issue.

In the image below, you can see the slug field with whitespaces -

https://bit.ly/35FB7Te

The model I have defined in models.py is

class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published')
    )

    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    author = models.ForeignKey(User, on_delete=models.CASCADE,
                                related_name='blog_post')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

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

    def __str__(self):
        return self.title

Modified admin panel -

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'author', 'publish', 'status')
    list_filter = ('status', 'created', 'publish', 'author')
    search_fields = ('title', 'body')
    prepopulated_fields = {'slug':('title',)}
    raw_id_fields = ('author',)
    date_hierarchy = 'publish'
    ordering = ('status', 'publish')

Attachments (1)

db.png (31.8 KB ) - added by Harshvardhan Anand 3 years ago.

Download all attachments as: .zip

Change History (2)

by Harshvardhan Anand, 3 years ago

Attachment: db.png added

comment:1 by Claude Paroz, 3 years ago

Resolution: invalid
Status: newclosed

This is expected behavior. The SlugField functionality is implemented though validation, which is activated by the forms infrastructure or by manually calling full_clean() on some model. If you set a value and save, you are on your own, there are no database-level checks. You can see the exact same behaviour for other fields like URLField.

Note: See TracTickets for help on using tickets.
Back to Top