Найти - Пользователи
Полная версия: Закрыть доступ пользователю к конкретной колонке во Flask
Начало » Web » Закрыть доступ пользователю к конкретной колонке во Flask
1
alexbadaloff
Если общими словами и на примере, то вот здесь http://examples.flask-admin.org/sqla/simple/admin/userview/ колонку email для harry оставить. А для amelia сделать так, как будто такой колонки не существует.

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    login = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(64))
    is_editor = db.Column(Boolean)
    # Flask-Login integration
    def is_authenticated(self):
        return True
    def is_active(self):
        return True
    def is_anonymous(self):
        return False
    def get_id(self):
        return self.id
    def __str__(self):
        return self.login
class UserView(sqla.ModelView):
    # я так понимаю здесь нужно как-то определить какой юзер залогинен
    # но print(dir(login.current_user.)) выдаёт следующее
    # ['__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
    def is_accessible(self):
        return login.current_user.is_authenticated

Как же правильно сделать?
alexbadaloff
В этой ветке вообще никого не бывает?
Ладно с колонками, вынесу в отдельную таблицу через отношение, и скрою её целиком.

Подскажите хотя бы как автоматически сохранять имя текущего пользователя, когда он создаёт запись или правит?

class testDb(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    number = db.Column(db.String(8), unique=True, index=True)
    lastUpdate = db.Column(db.DateTime, onupdate=db.func.localtimestamp())
    author = ???
ZerG
Может привязаться к модели пользователя по его айди?
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ....

author = db.Column(db.Integer, db.ForeignKey('User.id'))
alexbadaloff
Ок. К внешнему ключу этим привязали.
А где происходит вставка этого id?
Если добавить:
author = db.Column(db.Integer, db.ForeignKey('User.id'))
autor_rel = db.relationship('User')
Тогда на странице создания/правки записи будет следующее:


Это отсюда скриншот:
http://examples.flask-admin.org/sqla/simple/admin/postview/new/?url=%2Fsqla%2Fsimple%2Fadmin%2Fpostview%2F

То есть ручками вставлять нужного автора.
Но это не то что нужно.
Нужно чтобы автоматически подставлялся User, который правит или создаёт запись на этой странице.
ZerG
Дык в функции которая изменяет у вас значения добавьте запись в ето поле значение юзера который ето делает - у вас же есть статус залогиненного юзера в вебформе и его значения?
alexbadaloff
ZerG
Дык в функции которая изменяет у вас значения добавьте запись в ето поле значение юзера который ето делает
Я использую flask-admin. И надеялся в нём есть инструмент для этого.
Получается нужно наследовать класс BaseModelView и переписывать оттуда функцию edit_view как мне требуется.
    def edit_view(self):
        """
            Edit model view
        """
        return_url = get_redirect_target() or self.get_url('.index_view')
        if not self.can_edit:
            return redirect(return_url)
        id = get_mdict_item_or_list(request.args, 'id')
        if id is None:
            return redirect(return_url)
        model = self.get_one(id)
        if model is None:
            return redirect(return_url)
        form = self.edit_form(obj=model)
        if self.validate_form(form):
            if self.update_model(form, model):
                if '_continue_editing' in request.form:
                    flash(gettext('Record was successfully saved.'))
                    return redirect(request.url)
                else:
                    return redirect(return_url)
        if request.method == 'GET':
            self.on_form_prefill(form, id)
        form_opts = FormOpts(widget_args=self.form_widget_args,
                             form_rules=self._form_edit_rules)
        return self.render(self.edit_template,
                           model=model,
                           form=form,
                           form_opts=form_opts,
                           return_url=return_url)

И насколько мне хватает знаний в edit_view используется model = self.get_one(id)
И я надеялся, что нужно просто правильно написать модель.
Например как с lastUpdate = db.Column(db.DateTime, onupdate=db.func.localtimestamp()) - дата автоматически прописывается при обновлении записи.
Хотелось бы также пользователя редактирующего запись менять.
Или я просто всё понимаю неправильно.
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