много ко многим с дополнительным полем колба-админ sqlalchemy - PullRequest
0 голосов
/ 22 октября 2018

У меня есть вопрос об использовании класса ModelView.У меня есть 2 модели, которые имеют отношения многие ко многим.Мне пришлось изменить промежуточную таблицу, потому что она требует дополнительного элемента.

Я искал несколько решений, но ни одно из них не работает.Вот мои модели и то, что я пытаюсь сделать, чтобы создать раскрывающееся меню в представлении.

Я пытаюсь получить тот же результат, что и учебник, который я нашел на YouTube: enter image description here

Я много искал, но на самом деле нет никакого примера и никакой помощи для такого рода отношений и отображения.

Вот пример моего кода, если выесть идея, чтобы вести меня.Это было бы прекрасно.Заранее спасибо

models.py:

from flask_sqlalchemy import SQLAlchemy

# Create database connection object
db = SQLAlchemy()
class Cocktail(db.Model):
    __tablename__ = 'cocktail'

    idCocktails = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    description = db.Column(db.Text, nullable=False)
    bottles = db.relationship('Bottles_has_cocktails',lazy='dynamic', cascade="all, delete-orphan", backref='cocktail_join')
    path = db.Column(db.String(128))



class Bottle(db.Model):
    __tablename__ = 'bottle'
    idBottles = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    solenoidValve = db.Column(db.Integer, nullable=False)
    step = db.Column(db.Integer, nullable=False)
    empty = db.Column(db.Boolean, nullable=False)
    path = db.Column(db.String(128))
    cocktail = db.relationship('Bottles_has_cocktails', lazy='dynamic', cascade="all, delete-orphan", backref='bottle_join')



class Bottles_has_cocktails(db.Model):
    __tablename__ = 'bottlesHasCocktail'
    id_bottles = db.Column(db.Integer, db.ForeignKey('bottle.idBottles'), primary_key=True)
    id_cocktails = db.Column(db.Integer, db.ForeignKey('cocktail.idCocktails'), primary_key=True)
    dose = db.Column(db.Integer, nullable=False)
    bottle = db.relationship(Bottle, lazy='joined')

views.py:

import os
import os.path as op
from flask import Flask, url_for
from flask_admin import Admin, form
from flask_admin.contrib import sqla
from jinja2 import Markup
from sqlalchemy.event import listens_for

from engine.models import Bottle, Cocktail, Bottles_has_cocktails, db

basedir = os.path.abspath(os.path.dirname(__file__))
file_path = os.path.join(basedir, 'static', 'files')

app = Flask(__name__, static_folder='static')
app.config.from_object('config')

db.init_app(app)
with app.app_context():
    db.create_all()


@app.route('/')
def hello_world():
    return 'Hello World!'


#######################
# ADMINISTRATION LINES#
#######################

@listens_for(Cocktail, 'after_delete')
def del_image(mapper, connection, target):
    if target.path:
        # Delete image
        try:
            os.remove(op.join(file_path, target.path))
        except OSError:
            pass

        # Delete thumbnail
        try:
            os.remove(op.join(file_path,
                              form.thumbgen_filename(target.path)))
        except OSError:
            pass


def _list_thumbnail(view, context, model, name):
    if not model.path:
        return 'un test'

    return Markup('<img src="%s">' % url_for('static',
                                             filename='files/{}'.format(form.thumbgen_filename(model.path))))
class CocktailAdmin(sqla.ModelView):


    column_formatters = {
        'path': _list_thumbnail
    }
    # Alternative way to contribute field is to override it completely.
    # In this case, Flask-Admin won't attempt to merge various parameters for the field.
    form_extra_fields = {
        'path': form.ImageUploadField('Image',
                                      base_path=file_path,
                                      thumbnail_size=(100, 100, True),
                                      url_relative_path='files/',
                                      )
    }

class BottleAdmin(sqla.ModelView):
    column_display_pk = True
    form_columns = ['name','cocktail',]


class BottleAsCocktail(sqla.ModelView):
    #column_display_pk = True
    form_columns = ['dose']


admin = Admin(app, template_mode='bootstrap3')
admin.add_view(CocktailAdmin(Cocktail, db.session))
admin.add_view(BottleAdmin(Bottle, db.session))
admin.add_view(BottleAsCocktail(Bottles_has_cocktails, db.session))


if __name__ == "__main__":

    app.run(host='192.168.1.81', port=5000)
...