Есть модель QsqlTableModel.
Отображается через QTableView.
Понадобилось сделать диалог для редактирования, добавления записей.
Именно диалог не через QTableView,сначала кодил его в ручную(Четко заданы названия полей, и интупы для них).
Потом я понял что это долго, мучительно и не правильно.
Написал такой класс:
class BaseRecordDialog(QDialog):
    """docstring for Add"""
    def __init__(self):
        super(QDialog, self).__init__()
        self._model = None
        self.test_btn = QPushButton("Save")
        self.test_btn.clicked.connect(self.saveModel)
        self.layout = QVBoxLayout(self)
        self.record_layout = QFormLayout()
        self.layout.addLayout(self.record_layout)
        self.layout.addWidget(self.test_btn)
        self.inputs = {}
    def setModel(self, model):  #Метод принимает как арг. модель и на ее основе строит форму.
        self._model = model
        self.inputs = {}
        for x in xrange(0, model.columnCount()):
            header_text = model.headerData(x, Qt.Horizontal).toString()
            self.inputs[x] = QLineEdit()
            self.record_layout.addRow(header_text, self.inputs[x])

И все вроде-бы хорошо, но одними QEdit сыт не будешь.
Вопрос нормально ли из метода модели QsqlTableModel.data отдавать когда запросят данные для редактирования Qt.EditRole список, в диалоге соответсвенно если передан список отображать например QComboBox.
Все бы хорошо но модель одна и если QTableView отдать список то она неправильно это воспримет.
Тут наверное нужен делегат для нее*?
Но через QTableView редактирование полей производится не будет, но хотелось бы написать правильно.