﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
24428	Model field with default=callable and choices is always reported as changed	Carsten Fuchs	nobody	"Originating thread at django-users: https://groups.google.com/forum/#!topic/django-users/WhuG7X9eRWk

In a newly created Django project/app, please consider this `models.py` file:

{{{
#!python
# -*- coding: utf-8 -*-
from django.db import models

def VormonatsMonat():
    return 1

MONTHS_CHOICES = (
    (1, ""Jan""),
    (2, ""Feb""),
)

class Choice(models.Model):
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    monat = models.IntegerField(default=VormonatsMonat, choices=MONTHS_CHOICES)
}}}

Then, at the `./manage.py shell` prompt (creating a Choice instance is omitted here):

{{{
#!python
>>> from django.forms import ModelForm
>>> from TestApp.models import Choice
>>> class ChoiceForm(ModelForm):
...     class Meta:
...         model = Choice
...         fields = [""choice_text"", ""votes"", ""monat""]
...
>>> ch =  Choice.objects.get(pk=1)
>>> chv = Choice.objects.values().get(pk=1)
>>> ch
<Choice: Choice object>
>>> chv
{'monat': 1, 'choice_text': u'just a test', 'votes': 0, u'id': 1}
>>> ChoiceForm(chv, initial=chv, instance=ch).has_changed()
True 
}}}

The expected output is `False`, which is (in a new shell session) in fact obtained whenever the definition of field `monat` is slightly changed, e.g. to a constant default value rather than a callable, or with no choices.

I got as far as `BaseForm.changed_data()` in `django/forms/forms.py`, where for field `monat` we get
  - `field.show_hidden_initial == True`,
  - `hidden_widget.value_from_datadict(self.data, self.files, initial_prefixed_name) == None`,
  - resulting in `initial_value == u""""`,
resulting in the observed behaviour.

Is maybe `field.show_hidden_initial == True` (wrongly) because the `default=callable` makes it seem that the default value is not one of the available choices?
"	Bug	closed	Forms	dev	Normal	fixed			Ready for checkin	1	0	0	0	0	0
