Уведомления

Группа в Telegram: @pythonsu

#1 Март 6, 2016 15:55:09

kaper156
Зарегистрирован: 2015-06-06
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Pluggable Views и альтернативы

Есть класс наследуемый от MethodViews. Соответственно он реализует: get, post, put, delete, только они и нужны для взаимодействия с объектами. Проблема в следующем: при попытке сделать так:

{% set form = '<form action="' ~ link ~ '" method="delete">' %}
Форма продолжает слать GET запрос. Знаю, что можно отучить её делать такие вещи с помощью JS, но как обойтись без этого?
От объекта к объекту меняются параметры, такие как класс объекта (модель), класс формы объекта и т.д. но логика примерно одинакова. Можно ли создать класс экземпляр класса, каждый метод которого будет иметь определенный end_point?
Возможно я вообще не на том пути, подскажите свои идеи

Офлайн

#2 Март 6, 2016 16:09:03

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Flask Pluggable Views и альтернативы

Метод у формы может быть либо get либо post. Используете post для процедуры изменения, удаления или добавления объектов.

Офлайн

#3 Март 6, 2016 16:35:15

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Flask Pluggable Views и альтернативы

Без js никак

Офлайн

#4 Март 6, 2016 18:29:23

kaper156
Зарегистрирован: 2015-06-06
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Pluggable Views и альтернативы

Наделал такой гадости

class BaseView:
    def __init__(self, _class, _form, template_name, end_point=''):
        self.cls = _class
        self.form = _form
        self.template = template_name
        self.endpoint = end_point
        self.init_end_points()
    def init_end_points(self):
        app.add_url_rule('/%s/' % self.endpoint,
                         endpoint='%s' % self.endpoint,
                         view_func=self.all,
                         methods=['GET'])
        app.add_url_rule('/%s/add/' % self.endpoint,
                         endpoint='%s_add' % self.endpoint,
                         view_func=self.add,
                         methods=['POST'])
        app.add_url_rule('/%s/edit/<int:id>' % self.endpoint,
                         endpoint='%s_edit' % self.endpoint,
                         view_func=self.edit,
                         methods=['POST'])
        app.add_url_rule('/%s/delete/<int:id>' % self.endpoint,
                         endpoint='%s_delete' % self.endpoint,
                         view_func=self.delete,
                         methods=['POST'])
    def redirect(self):
        return redirect(self.endpoint)
    def all(self):
        results = list()
        for instance in db.session.query(self.cls).limit(OBJECT_PER_PAGE):
            results.append((instance, self.form(obj=instance)))
        # form to add new inst
        editor = self.form()
        return render_template(self.template, objects=results, form=editor)
    def edit(self, id):
        instance = db.session.query(self.cls).get(id)
        form = self.form(request.form, self.cls)
        if form.validate_on_submit():
            form.populate_obj(instance)
            db.session.commit()
            flash_edit(instance)
        else:
            flash_form_errors(form)
        return self.redirect()
    def add(self):
        form = self.form(request.form, self.cls)
        instance = self.cls()
        if form.validate_on_submit():
            form.populate_obj(instance)
            db.session.add(instance)
            db.session.commit()
            flash_add(instance)
        else:
            flash_form_errors(form)
        return self.redirect()
    def delete(self, id):
        instance = db.session.query(self.cls).get(id)
        db.session.query(self.cls).filter(self.cls.id == id).delete()
        flash_delete(instance)
        db.session.commit()
        return self.redirect()

Офлайн

#5 Март 6, 2016 21:12:21

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Flask Pluggable Views и альтернативы

Жуть. Посмотрите в сторону Flask-Classy чтобы такого не городить.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version