Django基于类的视图 - 线程问题?
我觉得我在用Django写的基于类的视图中遇到了线程问题。
在启动应用后,UpdateView正常工作,直到访问CreateView为止。之后,再访问UpdateView时,'code'字段会填上CreateView中get_initial方法生成的值。
这个问题只在网络服务器上出现,而在使用开发模式的runserver命令时没有问题。
举个例子,如果MyObject的一个实例的code是'123',那么访问UpdateView时,表单中会显示'123'。但如果访问了一个调用CreateView的页面,get_initial()会生成一个新的code,比如说'456'。从那以后,访问任何调用UpdateView的链接时,表单中显示的都是'456',而不是实例的实际code。
这是我项目中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)
网址模式:
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'),
)
有没有人能帮我解释一下,我可能在哪里造成了线程问题,以及如何避免这个问题的最佳实践是什么?
1 个回答
1
试着去掉对父类的 get_initial 方法的调用。看起来它使用的是类属性,而不是实例属性,这可能让你遇到麻烦。可以试试这样:
def get_initial(self):
myobject = MyObject.objects.order_by('-code')[0]
code = int(myobject.code) + 1
initial={'code': str(code)}
return initial