Невозможно создать новый объект модели Django в пост-запросе Ajax - PullRequest
2 голосов
/ 21 августа 2010

Это своего рода проблема / вопрос типа «Я уже потерял х часов отладки»: (

Следующий jS-код jQuery инициирует запрос POST после нажатия кнопки

$("#btn_create_tag").click(function(evt) {
$.post("/tag/createAjax", { 
    tagname: $("#txt_tag_name").val()       
    },
    function(data) {
    }
);
});

Djangoкод, который выполняется для этого вызова:

@suppress_logging_output
@login_required
def createAjax(request):
    if request.is_ajax() and request.method == 'POST':
        tagName = request.POST["tagname"]
        new_tag = Tag()
        new_tag.name = tagName
        new_tag.save()
        print "new tag with id %s has been created" % new_tag.id

Этот код выполняется успешно (я делаю проверки на пустое или уже существующее имя, но здесь я не написал, чтобы быть более понятным), но новыйОбъект тега НЕ создан. Я даже получаю "" новый тег с идентификатором% s был создан ", напечатанный по приглашению devserver, и каждый раз ID увеличивается, как предполагается, но объекты не сохраняются в БД.

Когда я выполняю

new_tag = Tag()
new_tag.name = tagName
new_tag.save()

из оболочки Django, новый объект Tag создается регулярно, но из запроса jQuery он не создается.

Имеете представление о том, что стоит делать, чточтобы проверить, как это отладить ....

За БД стоит PostgresSQL 8.3.

Любые предложения более чем приветствуются:)

Обновление :

Я написал UnitTest, который работает:

class AjaxTestCase(TestCase):
    def testAjaxCreateTag(self):
        tagNum = Tag.objects.filter(name="TEST_TAG").count()
        self.assertEqual(tagNum, 0)
        c = Client()
        c.post('/lookup/tag/createAjax', {'tagname': 'TEST_TAG'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        tagNum = Tag.objects.filter(name="TEST_TAG").count()
        self.assertEqual(tagNum, 1)

Update2 :

Хм, сегодня утром кажется, что все работает нормально, но код не изменился.Мне это совсем не нравится: (

Ответы [ 3 ]

1 голос
/ 21 августа 2010

Это звучит очень странно. Можете ли вы дважды проверить настройки базы данных? Убедитесь, что вы используете правильную базу данных внутри settings.py? Также напишите модульный тест для проверки кода, используя тестовый клиент Django . В вашем тестовом методе не забудьте отправить заголовок HTTP_X_REQUESTED_WITH для is_ajax() для работы.

1 голос
/ 22 августа 2010

Если вы используете TransactionMiddleware (см. http://docs.djangoproject.com/en/dev/topics/db/transactions/),, то не возвращение HttpResponse какого-либо рода приведет к падению и откату.

0 голосов
/ 21 августа 2010

1001 * попробовать *

new_tag=Tag(name=tagName)
new_tag.save()

Кстати - вы должны очистить новый тэг и не брать его непосредственно из POST

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...