TurboGears - Operações CRUD
Os seguintes métodos de sessão realizam operações CRUD -
DBSession.add(model object) - insere um registro na tabela mapeada.
DBSession.delete(model object) - exclui o registro da tabela.
DBSession.query(model).all() - recupera todos os registros da tabela (correspondendo a uma consulta SELECT).
Você pode aplicar o filtro ao conjunto de registros recuperado usando um atributo de filtro. Por exemplo, para recuperar registros com city = 'Hyderabad' na tabela de alunos, use a seguinte declaração -
DBSession.query(model.student).filter_by(city = ’Hyderabad’).all()
Veremos agora como interagir com os modelos por meio de URLs de controlador.
Primeiro, vamos projetar um formulário da ToscaWidgets para inserir os dados do aluno
Hello\hello\controllers.studentform.py
import tw2.core as twc
import tw2.forms as twf
class StudentForm(twf.Form):
class child(twf.TableLayout):
name = twf.TextField(size = 20)
city = twf.TextField()
address = twf.TextArea("",rows = 5, cols = 30)
pincode = twf.NumberField()
action = '/save_record'
submit = twf.SubmitButton(value = 'Submit')
No RootController (root.py do aplicativo Hello), adicione a seguinte função de mapeamento '/ add' URL -
from hello.controllers.studentform import StudentForm
class RootController(BaseController):
@expose('hello.templates.studentform')
def add(self, *args, **kw):
return dict(page='studentform', form = StudentForm)
Salve o seguinte código HTML como studentform.html na pasta de modelos -
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/"
lang = "en">
<head>
<title>Student Registration Form</title>
</head>
<body>
<div id = "getting_started">
${form.display(value = dict(title = 'Enter data'))}
</div>
</body>
</html>
Entrar http://localhost:8080/addno navegador após iniciar o servidor. O seguinte formulário de informações do aluno será aberto no navegador -
O formulário acima foi elaborado para ser enviado ao ‘/save_record’URL. Daí umsave_record() função precisa ser adicionada no root.pypara expô-lo. Os dados do formulário do aluno são recebidos por esta função como umdict()objeto. É usado para adicionar um novo registro na tabela do aluno subjacente ao modelo do aluno.
@expose()
#@validate(form = AdmissionForm, error_handler = index1)
def save_record(self, **kw):
newstudent = student(name = kw['name'],city = kw['city'],
address = kw['address'], pincode = kw['pincode'])
DBSession.add(newstudent)
flash(message = "new entry added successfully")
redirect("/listrec")
Observe que após a adição bem-sucedida, o navegador será redirecionado para ‘/listrec’ URL. Este URL é exposto por umlistrec() function. Esta função seleciona todos os registros na tabela de alunos e os envia na forma de um objeto dict para o modelo studentlist.html. estelistrec() função é a seguinte -
@expose ("hello.templates.studentlist")
def listrec(self):
entries = DBSession.query(student).all()
return dict(entries = entries)
O modelo studentlist.html itera através do objeto de dicionário de entradas usando a diretiva py: for. O modelo studentlist.html é o seguinte -
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/">
<head>
<link rel = "stylesheet" type = "text/css" media = "screen"
href = "${tg.url('/css/style.css')}" />
<title>Welcome to TurboGears</title>
</head>
<body>
<h1>Welcome to TurboGears</h1>
<py:with vars = "flash = tg.flash_obj.render('flash', use_js = False)">
<div py:if = "flash" py:replace = "Markup(flash)" />
</py:with>
<h2>Current Entries</h2>
<table border = '1'>
<thead>
<tr>
<th>Name</th>
<th>City</th>
<th>Address</th>
<th>Pincode</th>
</tr>
</thead>
<tbody>
<py:for each = "entry in entries">
<tr>
<td>${entry.name}</td>
<td>${entry.city}</td>
<td>${entry.address}</td>
<td>${entry.pincode}</td>
</tr>
</py:for>
</tbody>
</table>
</body>
</html>
Agora revisite o http://localhost:8080/adde insira os dados no formulário. Ao clicar no botão enviar, o navegador será levado para studentlist.html. Ele também exibirá uma mensagem de 'novo registro adicionado com sucesso'.