views:

530

answers:

1

I create a modelForm with instance to existing model (Book). I am not able to update the Books record. Adding a new record is fine but when I attempt to update, it appears to be unable to find the publisher (which is a foreign key). Error is "No Publisher matches the given query."

models.py

class Publisher(models.Model):

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"]

class Author(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

class Book(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)

class BookForm(ModelForm):

class Meta:

    model = Book

views.py

def authorcontactupd(request,id):

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})

error msg

Page not found (404) Request Method: POST Request URL: http://127.0.0.1:8000/books/bookupd/

No Publisher matches the given query.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

urls.py

from django.conf.urls.defaults import *

from django.views.generic.simple import direct_to_template

from mysite10.books.views import about_pages, books_by_publisher, authorcontact,bookcontact, booklisting, authorcontactupd

from django.views.generic import list_detail

from mysite10.books.models import Publisher, Book

from django.contrib import admin

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'),

)

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

I finally got it working with below codes. error in urls.py because of missing forward slash before $. Amended to (r'^books/bookupd/(\d+)/$'

views.py

def book_upd(request,id):

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'),

A: 

There's some missing information like what you have in your urls.py. Can you post it as well? Did you check in the database that the record was actually not updated? (the error might be a result of processing the redirect)


Your edit is not sufficient: - did you check the databse to see if the record is updated? - Please paste the entire urls.py as for example it is interesting to see what /contact/created is mapped to in case it did succeed, or whether you have some publisher.get() methods in it

In addition the traceback can also provide lots of useful information as to the source of the problem.


did you check if the object is updated in the database even though you get the error?

Can you try removing the "oreilly_books" section (or at least the queryset part) and try doing the same without it?

nivhab
urls.py appended
mcwong
did you check if the object is updated in the database even though you get the error?
nivhab