サーバーが再起動されるまで、データがさまざまなビューやリクエストにまたがって存続するように見えるという奇妙な問題に遭遇しました。
私は問題を次のコードに減らすことができました:
# 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???'
その後、問題はまだそこにあります。
行をコメントアウトすると問題が解消されます(ただし、フォームには明らかに初期データがありません)。