0

サーバーが再起動されるまで、データがさまざまなビューやリクエストにまたがって存続するように見えるという奇妙な問題に遭遇しました。

私は問題を次のコードに減らすことができました:

# 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>

再現するには、次のようにします。

  • foob​​arアプリをに追加しますsettings.INSTALLED_APPS
  • 走るsyncdb
  • foobar.urlsルートurlconfに追加します
  • に移動し/foobar/ます(実際のURLはルートURLconfによって異なります)
  • フォームを送信します(したがって、新しいFooオブジェクトを作成します)
  • に移動し/foobar/1/ます。フォームフィールドが事前入力されていることに注意してください(これは予想されます)
  • に移動し/foobar/ます。フォームフィールドがまだ入力されていることに注意してください(これは予期されていません)。

これはバグですか、それとも私がすべきではないことをしていますか(または両方...)?

- 編集 -

forms.pyで、update呼び出しを次のように置き換えると、次のようになります。

kwargs['initial']['bug'] = 'WHY???'

その後、問題はまだそこにあります。

行をコメントアウトすると問題が解消されます(ただし、フォームには明らかに初期データがありません)。

4

2 に答える 2

1

ビュークラスのクラスレベルのプロパティから渡されるkwargsを変更しているためです。

代わりに、それらをコピーしてコピーを更新します。

initial_defaults = {'bug': 'no'}
initial_defaults.update(kwargs.get('initial', {}))
defaults = kwargs.copy()
defaults['initial'] = initial_defaults 
于 2011-02-17T10:08:48.840 に答える
0

Django-1.3 開発を指定したい場合がありますが、ジェネリック クラス ビューは Django 1.2.5 には存在しません。forms.pyファイルで、次の行にコメントを付けて、もう一度やり直してください。

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)
于 2011-02-16T19:33:48.037 に答える