Сохранить modelForm для обновления существующей записи - PullRequest
2 голосов
/ 19 марта 2009

Я создаю модель с экземпляром существующей модели (Книга). Я не могу обновить запись Книги. Добавление новой записи - это хорошо, но когда я пытаюсь обновить, кажется, что не удается найти издателя (который является внешним ключом). Ошибка: «Издатель не соответствует заданному запросу».

models.py

Класс издателя (модел. Модель):

name = models.CharField(max_length=30)

address = models.CharField(max_length=50)

city = models.CharField(max_length=60)

state_province = models.CharField(max_length=30)

country = models.CharField(max_length=50)

website = models.URLField()

def __unicode__(self):
    return self.name

class Meta:

    ordering = ["name"]

класс Автор (models.Model):

first_name = models.CharField(max_length=30)

last_name = models.CharField(max_length=40)

email = models.EmailField(blank=True, verbose_name='e-mail')

objects = models.Manager()

sel_objects=AuthorManager()

def __unicode__(self):

return self.first_name+' '+ self.last_name

Книга класса (models.Model):

title = models.CharField(max_length=100)

authors = models.ManyToManyField(Author)

publisher = models.ForeignKey(Publisher)

publication_date = models.DateField(blank=True, null=True)

num_pages = models.IntegerField(blank=True, null=True)

Класс BookForm (ModelForm):

class Meta:

    model = Book

views.py

def authorcontactupd (запрос, идентификатор):

if request.method == 'POST':

    a=Author.objects.get(pk=int(id))

    form = AuthorForm(request.POST, instance=a)

    if form.is_valid():

        form.save()

        return HttpResponseRedirect('/contact/created')

else:

    a=Author.objects.get(pk=int(id))

    form = AuthorForm(instance=a)

return render_to_response('author_form.html', {'form': form})

ошибка msg

Страница не найдена (404) Способ запроса: POST URL запроса: http://127.0.0.1:8000/books/bookupd/

Издатель не соответствует данному запросу.

Вы видите эту ошибку, потому что у вас есть DEBUG = True в вашем файле настроек Django. Измените это на False, и Django отобразит стандартную страницу 404.

urls.py

из django.conf.urls.defaults import *

из django.views.generic.simple import direct_to_template

с сайта mysite10.books.views

из django.views.generic import list_detail

из mysite10.books.models import Publisher, Book

от администратора импорта django.contrib

admin.autodiscover ()

def get_books ():

return Book.objects.all()

publisher_info = {

'queryset': Publisher.objects.all(),

'template_name':'books/publisher_publisher_list_page.html',

'template_object_name': 'publisher',

'extra_context': {'book_list': Book.objects.all},

}

book_info = {

'queryset': Book.objects.order_by('-publication_date'),

'template_name':'books/publisher_publisher_list_page.html',

'template_object_name': 'book',

'extra_context': {'publisher_list': Publisher.objects.all},

}

oreilly_books = {

'queryset': Book.objects.filter(publisher__name="O'Reilly"),

'template_name':'books/publisher_publisher_list_page.html',

'template_object_name': 'book',

'extra_context': {'publisher_list': Publisher.objects.all},

}

urlpatterns = Patterns ('',

(r'^admin/(.*)', admin.site.root),

(r'^polls/', include('mysite10.polls.urls')),

(r'^search-form/$', 'mysite10.views.search_form'),

(r'^search/$', 'mysite10.views.search'),

(r'^contact/$', 'mysite10.contact.views.contact'),

(r'^contact/thanks2/(\d+)$', 'mysite10.contact.views.thanks2'),

(r'^contact/thanks/$', 'mysite10.contact.views.thanks'),

(r'^publishers/$', list_detail.object_list, publisher_info),

(r'^books/$', list_detail.object_list, book_info),

(r'^books/oreilly/$', list_detail.object_list, oreilly_books),

(r'^books/(\w+)/$', books_by_publisher),

(r'^author/$', authorcontact),

(r'^authorupd/(\d+)/$', authorcontactupd),

(r'^contact/created/$', 'mysite10.books.views.created'),

(r'^bookform/$', bookcontact),

(r'^contact/bookscreated/$', 'mysite10.books.views.books_created'),

(r'^booklist/$', 'mysite10.books.views.booklisting'),

(r'^books/bookupd/(\d+)$', 'mysite10.books.views.book_upd'),

)

----------------------------------------------- -

Я наконец-то начал работать с приведенными ниже кодами. ошибка в urls.py из-за отсутствия косой черты перед $. Изменено в (r '^ books / bookupd / (\ d +) / $'

views.py

def book_upd (запрос, идентификатор):

if request.method == 'POST':

    a=Book.objects.get(pk=int(id))

    form = BookForm(request.POST, instance=a)

    if form.is_valid():

        form.save()

        return HttpResponseRedirect('/contact/bookscreated')
else:

    a=Book.objects.get(pk=int(id))

    form = BookForm(instance=a)

return render_to_response('book_form.html', {'form': form})

urls.py

(r '^ books / bookupd / (\ d +) / $', 'mysite10.books.views.book_upd'),

1 Ответ

0 голосов
/ 19 марта 2009

Некоторая недостающая информация, например, та, что у вас есть в вашем urls.py. Вы можете также опубликовать это? Вы проверили в базе данных, что запись на самом деле не была обновлена? (ошибка может быть результатом обработки перенаправления)


Ваше редактирование недостаточно: - Вы проверили базу данных, чтобы увидеть, обновляется ли запись? - Пожалуйста, вставьте весь файл urls.py, например, интересно посмотреть, на что отображается / contact / созданный в случае успеха, или если в нем есть некоторые методы publisher.get ()

Кроме того, трассировка также может предоставить много полезной информации об источнике проблемы.


Вы проверили, обновляется ли объект в базе данных, даже если вы получили ошибку?

Можете ли вы попробовать удалить раздел "oreilly_books" (или хотя бы часть набора запросов) и попробовать сделать то же самое без него?

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