Save modelForm to update existing record

有些话、适合烂在心里 提交于 2020-01-02 16:18:09

问题


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


回答1:


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?



来源:https://stackoverflow.com/questions/661521/save-modelform-to-update-existing-record

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!