Форум сайта python.su
Пишу один проект, потребовалось использовать ajax. Много функций во views.py возвращающих json массив. urls.py разростается все быстрее. 1 функция - 1 урл. Наверно проблема в том, что надо было использовать cbv, а я использую обычные функции. Есть ли смысл переписывать все это в cbv или лучше сразу смотреть в сторону node.js?
Офлайн
Если план расширения закончен процентов на 60 и есть ресурсы, то еще не поздно перейти к CBV.
Учитывая фразу о Ноде, думаю, времени и ресурсов еще вагон :)
Офлайн
а нода чем вам поможет?
Офлайн
Проекты все разные, и в такой постановке вопроса ответы неизбежно будут очень общие.
На node.js писать сложнее, чем на джанге, и кашу там сделать еще проще.
Мне кажется, лучше подумать о том, как организовать имеющийся код. Например, разделить все получше на приложения, унести больше логики в формы и менеджеры/кверисеты, выделить как-то логику сериализации, раз json много, или посмотреть на django-tastypie/django-rest-framework.
CBV магическим образом проблемы не решат, это всего лишь способ организации кода (imho неудачный). Мое личное мнение - проблем CBV только добавят, и что CBV (особенно generic views) - это ужас-ужас, который использовать не нужно никогда, но это уже лирика, и у других разработчиков может быть свое мнение по этому вопросу)
Офлайн
kmikeА на чем основано ваше мнение?
CBV магическим образом проблемы не решат, это всего лишь способ организации кода (imho неудачный). Мое личное мнение - проблем CBV только добавят, и что CBV (особенно generic views) - это ужас-ужас, который использовать не нужно никогда, но это уже лирика, и у других разработчиков может быть свое мнение по этому вопросу)
Офлайн
barabansheg
может вы забыли про передачу аргументов из url в функцию представления? декораторы?
Таким образом можно организовать что бы urlconf выглядело как то так “^/json/(.*)” что бы часть урл передалась в 1 функцию представления, где уже реализовать необходимую логику которая бы возвращала нужный JSON ответ.
def foo(request, arg): if arg ... elif arg ... ... return response_with_json
Офлайн
А на чем основано ваше мнение?
class HybridDetailView(JSONResponseMixin, SingleObjectTemplateResponseMixin, BaseDetailView): def render_to_response(self, context): # Look for a 'format=json' GET argument if self.request.GET.get('format','html') == 'json': return JSONResponseMixin.render_to_response(self, context) else: return SingleObjectTemplateResponseMixin.render_to_response(self, context)
Офлайн
ИМХО CBV - самая достойная вещь, которая есть в Django. Применять или не применять? Не нравятся Вам миксины и обобщенные представления - не используйте. В общем случае, чем отличается представление-класс от классического представления-функции?
# function ## def foo(request, param): instance=get_object_or_404(MyModel, pk=param) return render_to_response('template.html', {'object':instance}) ## #class ## class Foo(View): def get(self, request, *args, **kwargs): instance=get_object_or_404(MyModel, pk=self.kwargs['param']) return render_to_response('template.html', {'object':instance})
# function ## def foo(request, param): instance=get_object_or_404(MyModel, pk=param) if request.method='POST': form=MyForm(request.POST) if form.is_valid: form.save() return HttpResponseRedirect(reverse( 'name' )) else: return render_to_response('template.html', {'object':instance, 'form':form}) else: form=MyForm() return render_to_response('template.html', {'object':instance, 'form':form}) ## #class ## class Foo(View): def get_instanse(self): instance=get_object_or_404(MyModel, pk=self.kwargs['param']) return instance def get(self, request, *args, **kwargs): form=MyForm() return render_to_response('template.html', {'object':self.get_instance(), 'form':form}) def post(self, request, *args, **kwargs): form=MyForm(request.POST) if form.is_valid: form.save() return HttpResponseRedirect(reverse( 'name' )) else: return render_to_response('template.html', {'object':self.get_instance(), 'form':form})
class Foo(FormView): template_name='template.html' success_url= 'name' form_class=MyForm def get_context_data(self, **kwargs): context=super(Foo, self).get_context_data(**kwargs) context['object']=get_object_or_404(MyModel, pk=self.kwargs['param']) return context
class BaseParamView(objects): def get_context_data(self, **kwargs): context=super(BaseParametrView, self).get_context_data(**kwargs) context['object']=get_object_or_404(MyModel, pk=self.kwargs['param']) return context
class Foo(BaseParamView, FormView): template_name='template.html' success_url= 'name' form_class=MyForm class Bar(BaseParamView,FormView): template_name='another_template.html' success_url= 'another_name' form_class=MyAnotherForm class Baz(BaseParamView, ListView) template_name='just_another_template.html' request=MyModel.objects.all() paginate_by=20
Офлайн
Насчет CBV подумал потому, что есть много однотипных функций где отличается лишь пара строк(используются разные модели, разные приложения, разные аргументы в зависимости от моделей). Если сводить подобное в одну функцию, то она разрастается до огромных размеров с кучей if-else.
Lexander, времени не то что бы вагон, но пока оно еще есть если переделывать. Но почитав примеры кода на node.js, понял, что лучше для меня будет даже оставить все как есть :)
JOHN_16, как-раз получится одна большая функция где много if-else, которые определяют что, куда и как сохранять.
Офлайн
barabansheg
в таком случае вовсе не обязательно переводить весь код на CBV модель, достаточно сделать таковым код который бы выдавал JSON, раз вы говорите что
barabansheg, то тут так и напрашивается обобщенная функция или иерархия вызово функций/классов. Исходя из вашего проекта попробуйте - мне кажется много времени не займет, а решение может прояснится.
есть много однотипных функций где отличается лишь пара строк
Офлайн