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>

要重现,请执行以下操作:

  • 将 foobar 应用程序添加到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,这些 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 回答