Представления на основе классов Django - проблема с многопоточностью? - PullRequest
1 голос
/ 23 июня 2011

Я думаю, что у меня возникла проблема с многопоточностью написанных мною представлений на основе классов Django.

После запуска приложения функция UpdateView работает нормально, пока CreateView не будет вызван или посещен.Затем последующие UpdateViews заполняют поле 'code' значением, созданным в методе get_initial CreateView.

Проблема отображается только на веб-сервере, а не при использовании команды runserver для разработки.

Например, если экземпляр MyObject имеет код «123», то при посещении UpdateView код в форме отображается как «123».После посещения страницы, которая вызывает CreateView, новый код генерируется get_initial (), скажем, «456».С этого момента при посещении любого URL-адреса, который вызывает UpdateView, в форме отображается «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'),
)

Может кто-нибудь помочь объяснить, где я мог бы вызвать проблему с резьбой, и как лучше всего избежать этого?

1 Ответ

1 голос
/ 23 июня 2011

Попробуйте удалить вызов супер get_initial. Кажется, он использует свойство класса вместо свойства экземпляра, что вызывает проблемы. Попробуйте это:

def get_initial(self):
    myobject = MyObject.objects.order_by('-code')[0]
    code = int(myobject.code) + 1
    initial={'code': str(code)}
    return initial
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...