django - не сохраняет в базу данных сразу - PullRequest
2 голосов
/ 28 декабря 2011

еще один вопрос новичка,

Сразу после сохранения элемента в базе данных я попытался получить доступ его первичный ключ для перенаправления своей страницы. Но я не мог сделать это. Я попытался вручную обработать транзакцию, как это объясняется в этом документе .

Может ли это быть из-за использования режима администратора?

Я получаю эту ошибку:

 invalid literal for int() with base 10: 'None'

Я изменил строку возврата на это, чтобы преобразовать id в строку

 return HttpResponseRedirect("/blog/page/"+str(page.id)+"/")

вот сегмент кода.

@transaction.commit_manually
def new_post_save(request):
    .
    .
    .
    page.save()  
    sid = transaction.savepoint()
    transaction.savepoint_commit(sid)
    return HttpResponseRedirect("/blog/page/"+page.id+"/")

вот остальные исходный вид и модель

def new_post_save(request):
page_name =  request.POST["page_name"]
content =  request.POST["content"]
postCategory = request.POST["cat"]

page = BlogPost(title = page_name,body = content, author = request.user, category = postCategory)

page.save()  
return HttpResponseRedirect("/blog/page/"+page.id+"/")

модель

class BlogPost(models.Model):
id = models.IntegerField(primary_key=True)
author = models.ForeignKey(User)
title = models.CharField(max_length=128)
body = models.TextField()
category = models.CharField(max_length=10, default='other')

def __unicode__(self):
    return self.title

здесь base.py Я полагаю, я не переопределил функцию сохранения.

def save(self, force_insert=False, force_update=False, using=None):
    """
    Saves the current instance. Override this in a subclass if you want to
    control the saving process.

    The 'force_insert' and 'force_update' parameters can be used to insist
    that the "save" must be an SQL insert or update (or equivalent for
    non-SQL backends), respectively. Normally, they should not be set.
    """
    if force_insert and force_update:
        raise ValueError("Cannot force both insert and updating in model saving.")
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)

    save.alters_data = True

в settings.py по базе данных

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': 'blog.db',                      
        'USER': '',                     
        'PASSWORD': '',                 
        'HOST': '',                    
        'PORT': '',                    
    }
}

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Удалите поле id из класса вашей модели.

Django автоматически вставит автоматическое поле с именем id, если вы не укажете первичный ключ, поэтому он вам не нужен.

Поскольку вы специально указали, что ваше поле id является целочисленным первичным ключом, Django ожидает, что вы сами управляете им. Как вы объявили, это IntField, а не AutoField, поэтому ему не присваивается никакое значение.

0 голосов
/ 29 декабря 2011

используйте это вместо ручного вызова save ()

page = BlogPost.objects.create (title = page_name, body = content, author = request.user, category = postCategory)

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