我遇到了一个奇怪的问题,数据似乎在不同的视图和请求中持续存在,直到服务器重新启动。
我设法将问题减少到以下代码:
# foobar/models.py
from django.db import models
class Foo(models.Model):
bug = models.CharField(max_length=10)
# foobar/forms.py
from django import forms
from foobar.models import Foo
class CreateForm(forms.ModelForm):
class Meta:
model = Foo
class UpdateForm(forms.ModelForm):
class Meta:
model = Foo
def __init__(self, *args, **kwargs):
kwargs.setdefault('initial', {})
kwargs['initial'].update({'bug': 'WHY??'})
super(UpdateForm, self).__init__(*args, **kwargs)
# foobar/views.py
from django.views.generic.edit import CreateView, UpdateView
from foobar.forms import CreateForm, UpdateForm
from foobar.models import Foo
class FooCreateView(CreateView):
form_class = CreateForm
template_name = 'foobar/foo_form.html'
create = FooCreateView.as_view()
class FooUpdateView(UpdateView):
form_class = UpdateForm
template_name = 'foobar/foo_form.html'
queryset = Foo.objects.all()
update = FooUpdateView.as_view()
# foobar/urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('foobar.views',
('^$', 'create'),
(r'^(?P<pk>\d+)/$', 'update'),
)
您还应该添加一个模板(foobar/templates/foo_form.html
例如):
<form action="" method="post">
{{ form.as_p }}
<input type="submit" />
{% csrf_token %}
</form>
要重现,请执行以下操作:
- 将 foobar 应用程序添加到
settings.INSTALLED_APPS
- 跑
syncdb
- 添加
foobar.urls
到您的根 urlconf - 导航到
/foobar/
(实际 URL 将取决于您的根 urlconf) - 提交表单(从而创建一个新的 Foo 对象)
- 导航到
/foobar/1/
。请注意,表单字段已预先填充(这是预期的) - 导航到
/foobar/
。请注意,表单字段仍被填充(这不是预期的)。
这是一个错误还是我在做我不应该做的事情(或者两者都......)?
- 编辑 -
在 forms.py 中,如果我将update
调用替换为:
kwargs['initial']['bug'] = 'WHY???'
然后问题仍然存在。
注释掉该行可以解决问题(但显然该表单没有初始数据)。