Найти - Пользователи
Полная версия: Flask Pluggable Views и альтернативы
Начало » Web » Flask Pluggable Views и альтернативы
1
kaper156
Есть класс наследуемый от MethodViews. Соответственно он реализует: get, post, put, delete, только они и нужны для взаимодействия с объектами. Проблема в следующем: при попытке сделать так:
{% set form = '<form action="' ~ link ~ '" method="delete">' %}
Форма продолжает слать GET запрос. Знаю, что можно отучить её делать такие вещи с помощью JS, но как обойтись без этого?
От объекта к объекту меняются параметры, такие как класс объекта (модель), класс формы объекта и т.д. но логика примерно одинакова. Можно ли создать класс экземпляр класса, каждый метод которого будет иметь определенный end_point?
Возможно я вообще не на том пути, подскажите свои идеи
ayb
Метод у формы может быть либо get либо post. Используете post для процедуры изменения, удаления или добавления объектов.

4kpt_IV
Без js никак
kaper156
Наделал такой гадости
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()
4kpt_IV
Жуть. Посмотрите в сторону Flask-Classy чтобы такого не городить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB