Opened 3 years ago

Closed 3 years ago

#20228 closed Bug (fixed)

Admin interface doesn't prevent duplicates with unique_for_date

Reported by: Marek Onuszko Owned by: Deepak
Component: Documentation Version: 1.4
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no


I'm using Python 2.7.3 and Django 1.4.5-1 from Debian repositories. I can add multiple entries with identical values and the admin interface doesn't complain. I tried with both 'slug' and 'title'.
It sounds just like the bug from 4 years ago:

Note that while my field is DateTimeField (with time), the wording of the description at leads me to believe it should consider only the .date component of the DateTimeField.


from django.db import models

from django.utils.timezone import now as utcnow
now = utcnow() # replacing - causes problems with auto_now_add

class Entry(models.Model):
    created_at = models.DateTimeField(default=now, editable=False)
    title      = models.CharField(max_length = 50)
    content    = models.TextField()
    slug       = models.SlugField(unique_for_date='created_at')

    def __unicode__(self):
        return self.title
    class Meta:
        ordering = ['-created_at']


from news.models import Entry
from django.contrib import admin

class EntryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}

    list_filter = ['created_at']
    date_hierarchy = 'created_at', EntryAdmin)

Change History (9)

comment:1 Changed 3 years ago by Aymeric Augustin

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset
Triage Stage: UnreviewedAccepted

I guess it currently does unique_for_datetime when used on a DateTimeField.

Changing to operate only on the date part is backwards incompatible, but I've already made a bunch of similar cleanups, I suppose we can do one more.

comment:2 Changed 3 years ago by Marek Onuszko

Either way, functionality should match the documentation. To my understanding of English, it currently doesn't. An extra sentence for clarification of DateTimeField would be nice. I can't evaluate how important backwards compatibility is in this case, but from programmer convenience point of view it would be very nice to have unique_for_date only consider the .date component. "unique_for_datetime" can already be achieved with unique_together.

comment:3 Changed 3 years ago by svisser

This seems similar to #18427; fixing one may also provide a stepping stone to fixing the other.

comment:4 Changed 3 years ago by Deepak

Component: Uncategorizedcontrib.admin

It looks like valid bug. Fortunately, it's limited to contrib.admin. I was unable to repeat this in ModelForms, Forms and Model Validation.

comment:5 Changed 3 years ago by Deepak

Owner: changed from nobody to Deepak
Status: newassigned

comment:6 Changed 3 years ago by Deepak

The reason for this is validate_unique skips "created_at" because it's internally in excluded fields since it's not rendered in admin UI.

@aaugustin Shouldn't we check instead of f.unique_for_* in exclude? ? If not then we should mark it as documentation bug and add a note in documentation that field should not be excluded.

Last edited 3 years ago by Deepak (previous) (diff)

comment:7 Changed 3 years ago by Deepak

Component: contrib.adminDatabase layer (models, ORM)

comment:8 Changed 3 years ago by Deepak

Component: Database layer (models, ORM)Documentation
Has patch: set

comment:9 Changed 3 years ago by Tim Graham <timograham@…>

Resolution: fixed
Status: assignedclosed

In d321d1acf0fdf00247e78b9686be84c18b35b9d8:

Fixed #20228 - Documented unique_for_date and exclude behavior.

Thanks Deepak Thukral for the patch.

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