基于Django类的视图线程问题



我认为我编写的基于Django类的视图遇到了线程问题。

启动应用程序后,UpdateView将正常工作,直到调用/访问CreateView为止。随后的UpdateViews使用CreateView的get_initial方法中生成的值填充"code"字段。

该问题仅在web服务器上显示,而在使用开发runserver命令时不会显示。

例如,如果MyObject的实例的代码为"123",则访问UpdateView会将表单中的代码显示为"123"。访问调用CreateView的页面后,get_initial()会生成一个新代码,比如"456"。从那时起,访问任何调用UpdateView的url都会在表单中显示"456",而不是实例的实际代码。

示例myproject.app.views.myobject视图类:

from django.contrib.auth.decorators import permission_required
from django.utils.decorators import method_decorator
from django.views import generic
from myproject.app.forms import MyObjectForm
from myproject.app.models import MyObject

class EditMixin(generic.base.View):
    form_class = MyObjectForm
    def get_success_url(self):
        return self.object.get_absolute_url()
    def form_valid(self, form):
        self.object = form.save(commit=False)
        if not self.object.pk:
            self.object.created_by = self.request.user
        self.object.updated_by = self.request.user
        self.object.save()
        messages.success(self.request, 'Object saved.')
        return HttpResponseRedirect(self.get_success_url())

class CreateView(EditMixin, generic.edit.CreateView):
    model = MyObject
    @method_decorator(permission_required('app.add_myobject'))
    def dispatch(self, *args, **kwargs):
        return super(CreateView, self).dispatch(*args, **kwargs)
    def get_initial(self):
        initial = super(CreateView, self).get_initial()
        #TODO: proper auto-generation of code
        myobject = MyObject.objects.order_by('-code')[0]
        code = int(myobject.code) + 1
        initial.update({'code': str(code)})
        return initial

class UpdateView(EditMixin, generic.edit.UpdateView):
    @method_decorator(permission_required('app.change_myobject'))
    def dispatch(self, *args, **kwargs):
        return super(UpdateView, self).dispatch(*args, **kwargs)
    def get_queryset(self):
        return MyObject.objects.filter(created_by=self.request.user)

Url模式:

from myproject.app.views import myobjects

urlpatterns = patterns('',
    url(r'^$', myobjects.ListView.as_view(), name='myobject_list'),
    url(r'^(?P<pk>[d]+)/$', myobjects.DetailView.as_view(),
        name='myobject_detail'),
    url(r'^(?P<pk>[d]+)/edit$', myobjects.UpdateView.as_view(),
        name='myobject_edit'),
    url(r'^new$', myobjects.CreateView.as_view(),
        name='myobject_new'),
)

有人能帮我解释一下我可能在哪里造成螺纹问题,以及避免这种情况的最佳做法吗?

尝试删除对super的get_initial的调用。它似乎使用了类属性而不是实例属性,这给您带来了麻烦。试试这个:

def get_initial(self):
    myobject = MyObject.objects.order_by('-code')[0]
    code = int(myobject.code) + 1
    initial={'code': str(code)}
    return initial

最新更新