2011-12-16 13 views
6

Nieporozumienie coś! Jeśli mój model nie jest zapisany, nie ma powiązanego identyfikatora. Więc jeśli mam coś takiego:instancja formularza modelu daje id = Brak Django

views.py (wstawianie i edytowanie istniejących informacji używa tego samego ModelForm)

def insert_or_modify(request, id=None): 
    if id is not None: 
     book = BookModel.objects.get(pk=id) 
    else: 
     book = BookModel() 

    if request.method == 'POST': 
     form = BookInfoForm(request.POST, request.FILES, instance=book) 
     if form.is_valid(): 
      form.save() 

    .... 

    return render_to_response(...) 

Mam też zdjęcie i użyć upload_to dla ImageField. Są dwa problemy: id jest Brak i nie jestem pewien, jak manipulować/zapisać instance=book, tak żebym dostał identyfikator. Drugi problem polega na tym, że lokalizacja, w której zapisuję moje dane, jest wyłączona. Mimo że szablon book.img.url posiada pożądaną lokalizację książki w http:127.0.0.1:8000/folder1/media/id/, rzeczywista lokalizacja jest gdzieś indziej:

gdzie chcę zapisać mój obraz do:

/project/folder1/media/id/ 

gdzie id jest identyfikator książki.

Co ja rzeczywiście dostać:

/project/id/  

(Ale 'id' staje się 'Brak', ponieważ nie istnieje!)

Moje poprzednie kod zadziałał. Zapisałoby się to w poprawnej lokalizacji, ale przy obecnym kodzie nie działa. Tak więc problem ze składowaniem nie wygląda na to, że spowodowany jest plikiem settings.py, ponieważ działał wcześniej.

EDIT: usuwa non-kod z numerem kierunkowym formatowanie

EDIT: I okazało się, dlaczego nie oszczędzając do właściwej lokalizacji. Jak się okazało, zapomniałem odkomentować coś, kiedy ostatnio modyfikowałem settings.py. Zapisywanie do lokalizacji działa teraz! Przepraszam chłopaki!

EDYCJA: Myślę, że id = Brak problem jest spowodowany przez form.save(). Jeśli tego nie zrobię i po prostu zapiszę model bezpośrednio, nie mam tego problemu.

Odpowiedz

1

Dla pierwszej części:

def insert_or_modify(request, id=None): 
    if id: 
     book = BookModel.objects.get(pk=id) 
     if request.method == 'POST': 
      form = BookInfoForm(request.POST, request.FILES, instance=book) 
      if form.is_valid(): 
       save_book = form.save() 
       # use save_book as your instance of BookModel 
     .... 
    else: 
     if request.method == 'POST': 
      form = BookInfoForm(request.POST, request.FILES) 
      if form.is_valid(): 
       save_book = form.save() 
       # use save_book as your instance of BookModel 
     .... 

save_book = form.save() pozwala następnie użyć save_book jako zapisanego instancji BookModel i save_book.id jest jego id.

+0

Dzięki! Tak, próbowałem czegoś takiego. Wciąż tworzy folder None, ale tym razem tworzy także folder id. Na przykład, jeśli zrobię 'save_book.img.save ('img', request.FILES ['img'])', img zostanie zapisany w/None i/1. – sharkfin

4

Id przypisuje tylko do zapisywania obiektów, gdy używasz pola id autoinkrementacji (domyślne). Przed zapisaniem obrazu można go zapisać, a następnie zapisać obraz.

Możliwe, że nie możesz się martwić o nazwę obrazu - ponieważ pliki django nie mają problemów z takimi samymi nazwami. Więc jeśli tylko zapisać plik „image.png”, a następnie zapisać inny plik o nazwie „image.png” - zostanie on zapisany jako „image_1.png”

def add_or_create(request, item_id=None): 
    item = get_object_or_404(BookModel, id=item_id) if item_id else None 
    form = BookInfoForm(request.POST or None, request.FILES or None, instance=book) # assume it is ModelForm 

    if form.is_valid(): 
     book = form.save() 
+1

Dzięki. Podoba mi się sposób, w jaki potraktowałeś warunkowe rzeczy (skopiujesz ten styl, heh heh). Ale nadal dostaję "Brak" dla id ... Myślę, że może to być, gdy zapisuje formularz, który powoduje problem Brak. Powróciłem do mojego starego kodu, więc działa na razie. – sharkfin

0

def create_id (instancja, some_id = Brak):

if some_id is None: 
    obj=Post.objects.first() 
    new_id=obj.id 
    new_id+=1 
    return new_id 
else: 
    return some_id 

def pre_save_post_receiver (nadawca, wystąpienie * argumenty ** kwargs)

if not instance.id: 
    instance.id = create_id(instance) 

pre_save.connect (pre_save_post_receiver, sender = Post)

+0

Proszę sformatować swój kod i dodać krótkie wyjaśnienie. –

Powiązane problemy