Уведомления

Группа в Telegram: @pythonsu

Уведомления

  • Found 3494 posts.

Python для новичков » изменить размерность-результат meshgrid поэффективнее » Фев. 25, 2013 18:09:04

каждая meshgrid генерирует кортеж с двумя матрицами и получается список с элементами из двух матриц.
Мне нужен список этих матриц не сдвоенный, причем даже не важен порядок. Внизу решение, но вот думаю можно ли как-то поэффективнее сделать — сразу применить оператор какой-нить к meshgrid?

reshape и resize не хочу использовать, т.к. нужно размер не нужен.
>>> x=array([1,2,3])
>>> y=array([4,5])
>>> M=array([meshgrid(y,x),meshgrid(y,x)])
>>> M
array([[[[4, 5],
[4, 5],
[4, 5]],

[[1, 1],
[2, 2],
[3, 3]]],


[[[4, 5],
[4, 5],
[4, 5]],

[[1, 1],
[2, 2],
[3, 3]]]])
>>> M=[M[i,j] for j in [0,1] for i in [0,1] ]
>>> M
[array([[4, 5],
[4, 5],
[4, 5]]), array([[4, 5],
[4, 5],
[4, 5]]), array([[1, 1],
[2, 2],
[3, 3]]), array([[1, 1],
[2, 2],
[3, 3]])]

Флейм » WANTED!! Middle Python Developer, Senior Python Developer » Фев. 25, 2013 12:44:33

Киев/Удаленная работа
Задачи:
- разработка архитектуры комплексных сервисов, высоконагруженных веб-приложений, внутренних и публичных API
- поддержка существующих продуктов компании
- опыт работы с Django/Flask/Pylons
- Конвертирование бизнес-задач в технические решения (R&D).
С нами можно связаться здесь или в скайпе yuriy.bondar.hr

Web » [Решено] flask-admin+mongoengine и разные колонки для юзеров » Фев. 25, 2013 12:17:58

Как реализовать вывод разных колонок для юзеров?
Не могу задать “column_exclude_list” в __init__, т.к. там current_user еще неопределен.
При определении “column_exclude_list” в методе “is_accessible” или “index” фильтрация колонок уже не срабатывает.
Решение: вызвать после определения “column_exclude_list” метод self._refresh_cache()


class OrderView(ModelView):
    create_template = 'order_create.html'
    def __init__(self, *args, **kwargs):
        super(OrderView, self).__init__(*args, **kwargs)
    def is_accessible(self):
        if current_user.name != "admin":
            self.column_exclude_list = ('user','links')
        else:
            self.column_exclude_list = ('links',)
        self._refresh_cache()
        return current_user.is_authenticated()
    @expose('/')
    def index(self):
        return super(OrderView, self).index_view()

Web » [решено] htaccess Flask » Фев. 23, 2013 19:03:28

Здравствуйте! В общем, проблема следующая. На хостинге все манипуляции с настройками производятся только с помощью .htaccess и приложение на Flask/Werkzeug некорректно отображает урлы(а именно, к каждому урлу подставляется путь /wsgi.py/ ).

Файл .htaccess:
Options +ExecCGI
AddHandler wsgi-script .py
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /wsgi.py/$1 [QSA,PT,L]
RewriteRule ^(static/.*)$ - [L]
RewriteRule ^(media/.*)$ - [L]

Файл wsgi.py(к нему идут все обращения):

#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
flask_ext = os.path.join(
    os.path.abspath(os.path.dirname(__file__)),
    'flask',
    'ext'
)
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
sys.path.append(flask_ext)
from myapp import app as application

То есть, сайт открывается, все работает, но вот непонятно почему урлы имеют вид: http://site.com/wsgi.py/contact/ и т.п. Также, почему-то файлы из папки media не подхватываются, а вот файлы из папки static вполне хорошо отображаются.

Спасибо!

P. S. До этого, работал с Django с тем же htaccess и все прекрасно работало без нареканий.
P. P. S. Проблема скорее всего с url_for, так при обращении к http://site.com/contact/ все также работает, кроме media.

В общем, проблему удалось частично решить. Решается добавлением следующего кода в ваш __init__.py:
class WSGIMiddleware(object):
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        environ['SCRIPT_NAME'] = '/'
        return self.app(environ, start_response)

А затем добавим такой код после app = Flask(__name__):
app.wsgi_app = WSGIMiddleware(app.wsgi_app)

UPDATE:

Разобрался, напишу на всякий случай здесь. Суть в том, что файлы из папки media были доступны, но не по адресу: http://site.com/media/, а http://site.com/appname/media/. Решается эта проблема либо объявлением урла или дописыванием в WSGIMiddleware пары строк, но проще всего перенести папку media в папку static. Flask по-умолчанию ищет файлы статики из папки static, это поведение можно переопределить при объявлении приложения: app = Flask(__name__, static_path = ‘ваша папка’). Однако, лучше оставить все как есть, также есть еще много решений, но вроде эти самые годные.

Всем спасибо!)

Python для новичков » Ошибка при переносе проекта на другой сервер » Фев. 23, 2013 17:46:40

При переносе проекта на другой сервер возникла ошибка:
Caught ViewDoesNotExist while rendering: Could not import filebrowser.views. Error was: No module named Image
Шаблон base.html
20 <script language=“javascript” src=“{{ STATIC_URL }}js/site.js” ></script>
21 {% endblock %}
22 {% block extrahead %}
23 {% endblock %}
24
25 <title>{% block title%}Сайт{% endblock %}</title>
26
27 </head>
28 <body>
29 <script language=“javascript”>
30 var settings_requirements_url = “{% url requirements %}”; Ругается на эту строчку
31 var settings_requirements_version = “{{ SYSTEM_REQUIREMENTS_VERSION }}”;
32 </script>
33 <div class=“wrapper”>
34 {% block messages %}
35 {% include “messages.html” %}
36 {% endblock %}
37 <div class=“container {% if DEBUG_GRID %}showgrid{% else %}sham-background{% endif %} ”>
38
39 {% block menu %}
40 <div class=“menu clearfix”>

По факту в urls.py:
url(r'requirements/$', direct_to_template,
{'template': ‘requirements.html’},
name='requirements'),
Даже если комментируешь строчку, ругается на другой url.
Причем тут filebrowser.views? На другом сервере все работает. Помогите, пожалуйста, разобраться.

Web » flask-login и before_app_request. » Фев. 22, 2013 08:45:00

Хотел сделать глобальную авторизацию для всего приложения, для этого проверяю пользователя в @app.before_request, потом подумал, что всё это можно перенести в blueprint
from flask import Blueprint
from flask.ext.login import current_user
authorization = Blueprint('authorization', __name__, template_folder='templates')
@authorization.before_app_request
def before_request():
    print current_user

Но ругается на current_user, можно это как-то обойти?

Базы данных » kinterbasdb и проблеммы с символами более u2014 (python 2.6) » Фев. 22, 2013 06:01:49

Имеется база Firebird в win1251 кодировке и 1 диалекте
строка подключения выглядит следующим образом -
  conn=kib.connect(dsn=dbase,user=user,password=passwd,dialect=1,charset='WIN1251')

чтение и запись данных в базу не доставляет проблемм ровдо до того момента как пытаюсь прочитать строку в которой присутствует символ более u2014. Показывает ошибку следующего вида :
File "/usr/lib/pymodules/python2.6/kinterbasdb/typeconv_text_unicode.py", line 190, in unicode_conv_out
    return rawString.decode(pyEncodingName)
  File "/usr/lib/python2.6/encodings/cp1251.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 5: character maps to <undefined>
происходит это при попытке считать значение u'11901\u2015' из базы. Что означает ощибка я полностью понимаю но вот чего с етим делать пока не придумал (лезти и править пакеты питона как то не охота).
UP !
поглядел внимательно на то что генерирует программа из базы которой и нужно получить данные. в кодировке Win1251 получается значение x98 коего нет не только в таблице преобразования Python но и в наборе символов тоже данный код отсутствует (идет x97 и сразу x99)

Всем спасибо !
решение найдено

Web » tornado windows autoreload » Фев. 20, 2013 22:12:47

тестирую tornado на windows в debug=true
при изменении кода в файлах autoreload срабатывает,
пишет сообщение, что сервер перегружен.
Но на самом деле он перегружается с какой-то ошибкой и не работает.
Поиск в гугле ничего не дал.

Писать свою перезагрузку или можно как-то устранить этот баг?
У кого-нибудь было такое?

Django » Django-tube? » Фев. 20, 2013 02:41:14

Что это и с чем его едят?

Python для новичков » Ucoz капча » Фев. 19, 2013 15:10:12

Такой вопрос, есть ли какой нибудь вариант обойти капчу при регистрации аккаунта на ucoz.ru?

Она выдается там в таком виде -

http://www.ucoz.ru/secure/?k=4179158637016338151;m=ureg;tm=0.3720149802339435

Причем на каждый запрос она меняется, т.е. при запросе страницы регистрации она уже подставляется та что нужно, но для того что отправить её на антигейт мне нужно прочитать её хотя бы 1 раз и закодировать в base64. Но после каждой такой попытки чтения мне каждый раз выскакивает уже другая капча …

Есть ли какой нибудь вариант решения этой проблемы ?

Python для экспертов » Python/Xlrd/Glade » Фев. 18, 2013 23:35:04

Привет всем! Кто хочет подработать?Есть предложения для опытных людей знающих Glade и xlrd(ну и питон )
75% проект готов, но код оочень сырой. Нужен фрилансер или два фрилансера для работы.
Суть работы.Создать полноценное дескопное приложение для анализа и обработки химических данных.
Кодеры из Питера приветствуются.
Заинтересовавшийся пишите на мыло или тут.
sadikhov.emin@gmal.com

Флейм » Американские службы доставки: Fedex, UPS, USPS » Фев. 18, 2013 23:29:40

Здравствуйте уважаемые форумчане. Кто-то с вас внедрял перечисленные в теме службы доставки?
Если да - какие были сложности, грабли?
Если не трудно напишите на почту: tattkov@gmail.com
Будет приятно пообщаться и позаимствовать опыта =)

Инструментальные средства разработки » Pycharm 2.7 не видит команды south через ctrl+alt+r » Фев. 17, 2013 12:26:32

South поставлен. Пробовал запускать задачи в разных виртуальных окружениях. Глюк только заметил. Может настройки какие слетели? Или это баг. У кого-нибудь такое есть? если у вас всё ок, отпишитесь. Буду ковырять настройки

Инструментальные средства разработки » PyCharm - интерактивная консоль. » Фев. 13, 2013 20:26:07

Прошу прощения, я, наверно, наскосячу в терминологии.
Я использую питон как инструмент в исследовании. Использую Spyder/IDLE, но они оба меня не полностью устраивают. Установил траял PyCharm и не нашёл возможности после завершения исполнения кода, работать с переменными и функциями, которые использовались.
Расскажите пожалуйста, есть ли такая функция в самой программе, или может быть есть плагин?

Django » Подкатегории в админке » Фев. 13, 2013 12:32:06

Здравствуйте!
Изучаю пример блога.
модель:
class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    description=models.TextField(max_length=300)
    body = models.TextField()
    timestamp=models.DateTimeField(db_index=True)
    category = models.ForeignKey('auto.Category')
    class Meta:
        ordering=('-timestamp',)
    def __unicode__(self):
        return '%s' % self.title
    @permalink
    def get_absolute_url(self):
        return ('view_blog_post', None, { 'slug': self.slug })
class Category(models.Model):
    title = models.CharField(max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, db_index=True)
    def __unicode__(self):
        return '%s' % self.title
    @permalink
    def get_absolute_url(self):
        return ('view_blog_category', None, { 'slug': self.slug })
class BlogAdmin(admin.ModelAdmin):
    #exclude = ['timestamp',]
    list_display=('title', 'timestamp')
    prepopulated_fields = {'slug': ('title',)}
class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}
admin.site.register(Blog, BlogAdmin)
admin.site.register(Category, CategoryAdmin)
В админке, соответственно, появились посты и категории. Но они существуют параллельно. Т.е. отдельно список категорий, отдельно список всех постов. А как можно вложить посты в категории? Т.е. чтобы в меню категорий можно было не только добавлять.удалять категории, но и создавать посты?
Спасибо!

Флейм » Lead Python Developer/Москва/130 000 » Фев. 13, 2013 12:14:17

В крупной IT компании, ориентированной исключительно на зарубежный рынок, открыта позиция Lead Python Developer.
Проекты сложные, команда сильная, начало рабочего дня достаточно гибкий

Город: Москва
Тип занятости: Полная
ЗП: 130 000 net

Обязанности:
  • разработка web проектов компании
    разработка с спецификаций задач
    постановка задач разработчикам и проверка результата

Требования:
  • знание Python (Django)
    Опыт ведение Web проектов
    Web технологии - HTML/CSS/JS
    JavaScript (из фреймворков желательно JQuery)
    приветствуется опыт работы с Apache, Nginx
    английский - intermediate


Желательно:
  • опыт написания bash скриптов
    опыт написания запросов на SQL для MySQL, PostgreSQL
    целеустремленность, желание развиваться и умение встраиваться в команду

Условия:
  • сильная профессиональная команда
    оформление по ТК РФ
    гибкий график
    постоянное использование английского языка
    оплата переработок
    пересмотр уровня заработной платы

Подробности готова рассказать по телефону
+7 (926) 665-17-75, Ольга.

Также пишите на почту/скайп:
ogolubyatnikova@spice-agency.ru
snega666

Флейм » Ищем Python разработчика на постоянную работу (Москва) » Фев. 13, 2013 08:15:14

Привет, ищем разработчика в отдел внутренней автоматизации. Очень хотим, чтобы это был разработчик на Python. Зарплата по результатам собеседования. Компания занимается интернет-рекламой, SEO, SMM. Офис в центре Москвы, в 5 минутах от метро пешком. Корпоративное обучение, печеньки, кофе и так далее присутствуют.

Ну и наши небольшие требования:

Опыт программирования на языке Python от 2 лет;
Опыт программирования на языке Javascript‚ jQuery:
Опыт работы с фреймворком Django; XHTML/ HTML5;
Знание языка SQL‚ желательно знать тонкости PostgreSQL;
опыт работы с Unix подобными системами;
svn, git;

Ну и самое главное, желание работать и развиваться!

По всем вопросам просьба писать на мыло yoolkepaalke@gmail.com
Спасибо.

Network » Как сломать серверный сокет? » Фев. 11, 2013 17:27:33

php скрипт из-под Apache коннектится к py-скрипту через сокет. Обычно всё работает, но иногда ломается. Перезагрузка py-скрипта исправляет ситуацию.

В логах Апача ошибка:
PHP Warning: socket_recv(): unable to read from socket : Connection reset by peer in /var/www/html/host/Client.php on line 25, referer: https://192.168.1.153/

В логах py-скрипта ничего нет.

Хочу сделать обработку ошибок сокета со стороны python-а.

Как воспроизвести ситуацию?

Django » Обновление MPTT дерева из JSON » Фев. 11, 2013 11:37:36

Добрый день!

Необходимо сделать на фронте редактирование Django MPTT-древа (сортировка, изменение родителей). Нашел jquery плагин Nestable (http://dbushell.github.com/Nestable/), который вполне подходит. Но при изменении древа я могу получить только JSON этого древа в таком формате:

[{
    "id": 1
}, {
    "id": 2,
    "children": [{
        "id": 3
    }, {
        "id": 4
    }, {
        "id": 5,
        "children": [{
            "id": 6
        }, {
            "id": 7
        }, {
            "id": 8
        }]
    }, {
        "id": 9
    }, {
        "id": 10
    }]
}, {
    "id": 11
}, {
    "id": 12
}]

Как я могу обновить свое древо в бд, чтобы оно соответствовало этой JSON-структуре?

Или может быть кто подскажет другой jQuery-плагин, с которым это будет проще сделать?

Спасибо!

Базы данных » QComboBox+mapper возвращает индекс вместо текста » Фев. 10, 2013 15:57:35

from PyQt4 import QtGui,  QtSql,  QtCore
import os.path
 
class window1(QtGui.QWidget):
    def __init__(self,  titletext):
        QtGui.QWidget.__init__(self)
        self.resize(800,  600)
        self.setWindowTitle(titletext)
 
        self.OpenOrCreateDB() #подключаемся к БД или создаём новую БД
 
        self.layout1 = QtGui.QVBoxLayout() # создаём контейнер для расположения в нём других виджетов
        self.setLayout(self.layout1) # назначаем его основным для нашей формы (окна)
 
        self.model1 = QtSql.QSqlTableModel(None,  self.DB) #создаём модель для хранения строк из БД, указываем с какой БД ей работать
        self.model1.setTable("table1") # указываем нужную таблицу из БД
        self.model1.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) # данные сохраняются в БД посредством этой модели, только по команде
        self.model1.select() # запускаем комаду select, для выборки всех записей из указанной таблицы БД
        self.tableView1 = QtGui.QTableView() # создаём грид (таблицу для отображения данных из модели) для формы
        self.tableView1.setModel(self.model1) # указываем гриду из какой модели брать данные для отображения
        self.tableView1.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) #таким зашибенным способом запрещается редактирование ячеек пользователем
        self.layout1.addWidget(self.tableView1)
 
        self.btnNew = QtGui.QPushButton("Добавить новую строку в БД") #создаём кнопку
        self.btnNew.clicked.connect(self.btnNewClicked) # связываем событие нажатия на кнопку с обработчиком для этого события
        self.layout1.addWidget(self.btnNew) # добавляем её в контейнер на форме
 
        self.btnEdit = QtGui.QPushButton("Редактировать текущую строку БД")
        self.btnEdit.clicked.connect(self.btnEditClicked)
        self.layout1.addWidget(self.btnEdit)
 
    def btnNewClicked(self):
        self.OpenEditWindow("NEW")
 
    def btnEditClicked(self):
        self.OpenEditWindow("EDIT")
 
    def OpenEditWindow(self, NewOrEdit):
        secondwindow = window2(NewOrEdit,  self.tableView1.currentIndex().row())
        result = secondwindow.exec() # если здесь использовать show, то окно не будет модальным! Т.е. из него можно будет спокойно перейти в другое окно.
        print (result)
 
    def OpenOrCreateDB(self):
        #создаём объект для работы с БД
        self.DB = QtSql.QSqlDatabase.addDatabase("QSQLITE", "Base")
        self.DB.setDatabaseName("./SQLiteBase/Lesson16DB.db")
 
        existDB = os.path.exists("./SQLiteBase/Lesson16DB.db")  #проверяем физичиское наличие БД
        if not existDB: print ("БД не существует. Попытка создать новую БД...")
 
        if not self.DB.open(): #попытка открыть БД (она же создание новой БД, если файла БД не существует)
            print("БД не открылась! Ошибка:",  self.DB.lastError().text())
        else: #подключение к БД произошло. Если при этом была создана новая БД, нужно создать в ней таблицы
            if not existDB: self.CreateStructureOfNewDB()
 
    def CreateStructureOfNewDB(self):
        query = QtSql.QSqlQuery(self.DB)
        querytext = ("CREATE TABLE table1 ("
                                           "id INTEGER, "
                                           "fam VARCHAR(20), "
                                           "im VARCHAR(20), "
                                           "ot VARCHAR(20), "
                                           "dr DATE, "
                                           "pol VARCHAR(1), "
                                           "gorod VARCHAR(20)"
                                           ")")
        #print (querytext)
        errors = 0
        tmp = query.exec(querytext)
        if not tmp:
            errors = errors + 1
 
        querytext = ("CREATE TABLE spisok1 ("
                     "id INTEGER, "
                     "text VARCHAR(20)"
                     ")")
 
        tmp = query.exec(querytext)
        if not tmp:
            errors = errors + 1
 
        return tmp
        if errors > 1:
            print ("БД не создана! Ошибка: ",  self.DB.lastError().text())
            return False
        else: return True
 
class window2(QtGui.QDialog): # создаём окно типа Диалог
    def __init__(self,  NewOrEdit,  currentIndex_):
        QtGui.QDialog.__init__(self)
 
        self.mapper = QtGui.QDataWidgetMapper() #маппер для связки данных из модели с контролами
        self.mapper.setModel(windowmain.model1) #связываем его с моделью данных из объекта windowmain
        self.mapper.setSubmitPolicy(QtGui.QDataWidgetMapper.ManualSubmit) #обновление данных в модели будет произведено только по команде
 
        tmpstr = NewOrEdit
        if NewOrEdit == "NEW":
            tmpstr = "Добавление новой записи в БД"
            Record = windowmain.model1.record() #создаём объект типа рекорд для добавления строки в модель
            windowmain.model1.insertRecord(-1,  Record) #insertRow использовать не стоит! Он не поддерживает связанные таблицы! 
            self.mapper.toLast() #маппер тоже передвигаем к последней записи!
        elif NewOrEdit == "EDIT":
            tmpstr = "Редактирование записи"
        self.setWindowTitle(tmpstr)
        #self.setWindowModality(QtCore.Qt.WindowModal)
 
        self.layout2 = QtGui.QHBoxLayout()
        self.layout2_1 = QtGui.QVBoxLayout()
        self.layout2.addLayout(self.layout2_1)
        self.layout2_2 = QtGui.QVBoxLayout()
        self.layout2.addLayout(self.layout2_2)
        self.layout2_3 = QtGui.QHBoxLayout()
        self.layout2.addLayout(self.layout2_3)
        self.setLayout(self.layout2)
 
 
        Alignment = QtCore.Qt.AlignTop
 
        self.id_label = QtGui.QLabel("Номер")
        self.id_ = QtGui.QLineEdit()
        self.layout2_1.addWidget(self.id_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.id_,  alignment = Alignment)
        self.mapper.addMapping(self.id_,  windowmain.model1.fieldIndex("id")) #связываем контрол id_ с полем id из маппера, который передаст значение в модель, которая передаст в БД (вот такие тут все передасты!)
 
        self.fam_label = QtGui.QLabel("Фамилия")
        self.fam_ = QtGui.QLineEdit()
        self.layout2_1.addWidget(self.fam_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.fam_,  alignment = Alignment)
        self.mapper.addMapping(self.fam_,  windowmain.model1.fieldIndex("fam"))
 
        self.im_label = QtGui.QLabel("Имя")
        self.im_ = QtGui.QLineEdit()
        self.layout2_1.addWidget(self.im_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.im_,  alignment = Alignment)
        self.mapper.addMapping(self.im_,  windowmain.model1.fieldIndex("im"))
 
        self.ot_label = QtGui.QLabel("Отчество")
        self.ot_ = QtGui.QLineEdit()
        self.layout2_1.addWidget(self.ot_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.ot_,  alignment = Alignment)
        self.mapper.addMapping(self.ot_,  windowmain.model1.fieldIndex("ot"))
 
        self.dr_label = QtGui.QLabel("Дата рождения")
        self.dr_ = QtGui.QLineEdit()
        self.layout2_1.addWidget(self.dr_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.dr_,  alignment = Alignment)
        self.mapper.addMapping(self.dr_,  windowmain.model1.fieldIndex("dr"))
 
        self.pol_label = QtGui.QLabel("Пол")
        self.pol_ = QtGui.QLineEdit()
        self.layout2_1.addWidget(self.pol_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.pol_,  alignment = Alignment)
        self.mapper.addMapping(self.pol_,  windowmain.model1.fieldIndex("pol"))
 
        self.gorod_label = QtGui.QLabel("Город")
        self.gorod_ = QtGui.QComboBox()
        #создаём модель для комбобокса
        self.gorodModel = QtSql.QSqlTableModel(None,  windowmain.DB)
        self.gorodModel.setTable("spisok1")
        self.gorodModel.select()
        self.gorod_.setModel(self.gorodModel)
        self.gorod_.setModelColumn(1)
        self.layout2_1.addWidget(self.gorod_label,  alignment = Alignment)
        self.layout2_2.addWidget(self.gorod_,  alignment = Alignment)
        self.mapper.addMapping(self.gorod_,  windowmain.model1.fieldIndex("gorod"))
 
        self.btnSave = QtGui.QPushButton("Запомнить")
        self.btnSave.clicked.connect(self.SaveData)
        self.layout2_3.addWidget(self.btnSave,  alignment = QtCore.Qt.AlignRight)
 
 
        self.btnCancel = QtGui.QPushButton("Отменить")
        self.btnCancel.clicked.connect(self.Cancel)
        self.layout2_3.addWidget(self.btnCancel,  alignment = QtCore.Qt.AlignRight)
 
        if NewOrEdit == "EDIT":
            self.mapper.setCurrentIndex(currentIndex_) # Этот способ выбора текущей строки из модели нужно проерить. Что будет, если данные в модели будут отсортированы?
 
    def SaveData(self):
        self.mapper.submit() #сохраняем изменения в модели
        windowmain.model1.submitAll() # а теперь сохраняем изменения из модели в БД
        self.close()
 
    def Cancel(self):
        windowmain.model1.revertAll() #отменяем изменения в модели. Иначе вновь добавленная строка останется.
        self.close() #закрываем окно
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    windowmain = window1("Первое окно")
    windowmain.show()
    sys.exit(app.exec_())

Смотрим на строку self.mapper.addMapping(self.gorod_, windowmain.model1.fieldIndex(“gorod”))

Как указать мапперу, что в поле gorod таблицы table1 нужно записать значение поля text из таблицы spisok1? Чего он мне туда индекс записывает?