2012-07-02 7 views
14

Moja aplikacja używa kombinacji kolby, kolby-SQLAlchemy, Flask-WTF i Jinja2.Flask-SQLAlchemy: Jak warunkowo wstawić lub zaktualizować wiersz

W obecnym wcieleniu mam tabelę ustawień. Tabela będzie miała tylko jeden rekord z jednym polem. Początkowo tabela zawiera zero rekordów.

Co chcę osiągnąć jest:

  • Biorąc pod uwagę, że nie istnieją wpisy w db, a następnie pokazać pusty formularz gotowy do wejścia użytkownika
  • Zważywszy, że istnieje wpis, pokazać wpis, a
  • jeśli użytkownik zmieni wartość, zaktualizuj rekcję w db.

Oto mój kod:

models.py

class Provider(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    rssfeed = db.Column(db.String(120), unique = True) 

    def __init__(self, rssfeed): 
     self.rssfeed = rssfeed 

    def __repr__(self): 
     return '<NZBMatrix feed url %r>' % self.rssfeed 

forms.py

class SettingsForm(Form): 
    rssfeed = TextField('rssfed', validators= [Required()]) 

views.py

@app.route('/settings', methods=["GET","POST"]) 
    def settings(): 
    """ show settings """ 
     provider = Provider.query.get(1) 
     form = SettingsForm(obj=provider) 
     print provider 

     if request.method == "POST" and form.validate(): 
      if Provider.query.get(1) is None: 
       provider = Provider(rssfeed=form.rssfeed.data) 
       form.populate_obj(provider) 
       db.session.add(provider) 
       db.session.commit() 
       flash("Settings added") 

     return render_template("settings.html", form=form) 

W obecnej postaci kod tworzy rekord, jeśli nie istnieje, ale kolumna rssfeed jest pusta.

Jak mogę zmienić ten kod tak, aby był INSERT, jeśli rekord nie istnieje i UPDATE, jeśli tak się stanie?

+1

Po prostu dla FYI - 'form.validate' powinno być' form.validate() '- funkcja jest zawsze pełna prawdy, ale twoja forma * może * nie przejdzie walidacji. –

+0

Dzięki za wskazanie tego! – happygoat

Odpowiedz

28

Gdy forma jest sprawdzana itp

Aby dodać nowy rekord:

new_provider = Provider(form.rssfeed.data) 
db.session.add(new_provider) 
db.session.commit() 

Aby zaktualizować istniejący rekord:

existing_provider = Provider.query.get(1) # or whatever 
# update the rssfeed column 
existing_provider.rssfeed = form.rssfeed.data 
db.session.commit() 

Sztuczka w aktualizacji polega na zmianie pola i wykonaniu zatwierdzenia. reszta jest obsługiwana przez sesję db. Myślę, że używasz funkcji scalania, która jest teraz przestarzała w SQLAlchemy.

4

udało mi się rozwiązać problem robi te zmiany w pliku view.py:

@app.route('/settings', methods=["GET","POST"]) 
def settings(): 
    """ show settings """ 
    provider = Provider.query.get(1) 
    form = SettingsForm(request.form,obj=provider) 

    if request.method == "POST" and form.validate(): 
     if provider: 
      provider.rssfeed = form.rssfeed.data 
      db.session.merge(provider) 
      db.session.commit() 
      flash("Settings changed") 
      return redirect(url_for("index")) 
     else: 
      provider = Provider(form.rssfeed.data) 
      db.session.add(provider) 
      db.session.commit() 
      flash("Settings added") 
      return redirect(url_for("index")) 
    return render_template("settings.html", form=form) 
Powiązane problemy