Как в Django CBV реализовать условие if/else?

Чувствую что данный код реализован неправильно(дублирование кода) но не знаю как сделать условие if/else в классе.
То есть хочется чтобы в url передавался параметр и на его основе делалось решение в условии.
urls.py
urlpatterns = [
    url(r'^(?P<pk>\d+)/$', ArticleDetail.as_view()),
    url(r'^add_like/(?P<pk>\d+)/$', ArticleDetail_add_like.as_view()),
]


views.py
class ArticleDetail(DetailView):
    model = Article
    template_name = "articles/article.html"

class ArticleDetail_add_like(DetailView):
    model = Article
    template_name = "articles/article.html"

    def get_object(self):
        object = super(ArticleDetail_add_like, self).get_object()
        object.article_likes += 1
        object.save()
        return object
  • Вопрос задан
  • 537 просмотров
Решения вопроса 1
pinkevich
@pinkevich
Developer
не совсем понял, но если вы хотите убрать дублирование кода, то можете наследоваться от ArticleDetail:
class ArticleDetailView(DetailView):
    model = Article
    template_name = "articles/article.html"

class ArticleDetailAddLikeView(ArticleDetailView):

    def get_object(self):
        object = super(ArticleDetailAddLikeView, self).get_object()
        object.article_likes += 1
        object.save()
        return object
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@marazmiki
Укротитель питонов
Наследование, конечно, позволит избавиться от дублирования кода, но есть два момента: во-первых, Вы меняете функциональное назначение get_object() и заставляете его что-то записывать, что само по себе некрасиво с точки зрения программиста :) если уж идти этим изначально неверным путём (ниже объясню почему неверным), то, думаю, красивее было бы переопределить dispatch().

Во-вторых и главных, делать сохраняющие операции на HTTP-методы GET, HEAD и OPTIONS не рекомендуется никому. Хотя бы из тех соображений, что через несколько секунд после того, как Вы впервые их запросите, налетят всякие гуглоботы и накрутят счётчики. И хорошо ещё, если отказ в обслуживании не вызовут.

Считается хорошим тоном и признаком здравого смысла использовать для сохраняющих вьюшек метод POST. Или, что ещё лучше, использовать RESTful-подход с POST, PUT и DELETE для создания, изменения и удаления соответственно.

Конкретно в Вашем случае, мне кажется, для вьюхи инкременатции счётчика лучше всего использовать FormView. Или UpdateView, там уже реализован метод get_object().
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы