2011-01-12 16 views
36

Forse una domanda per principianti, quindi per favore abbiate pazienza con me.Come aggiornare un oggetto dal modulo di modifica in Django?

Ho un modulo Django che modifica una determinata istanza di un modello. Per sapere quale oggetto è stato modificato, ho un campo nascosto contenente l'id dell'oggetto, insieme all'URL che contiene l'id.

Prima domanda: L'id dell'oggetto in un campo nascosto è il modo giusto di farlo?

La mia preoccupazione (forse infondata) di averlo solo come parte dell'URL è che qualcuno potrebbe quindi aprire la pagina di un ID oggetto, inviare il modulo a un altro e quell'oggetto verrà quindi sovrascritto. Ecco perché sto cercando di usare un campo nascosto.

Il problema con la memorizzazione dell'ID in un campo nascosto è che, in fase di convalida del modulo, Django si lamenta che l'oggetto non ha un ID univoco (ovviamente).

Seconda domanda: Se un campo univoco fa parte di un modulo, come si può dire a Django di ignorare il fatto che tale chiave esiste già, per aggiornare l'oggetto?

+0

Can me il modulo mostrare? PS: Sì, senza le protezioni in vigore (permessi), '/ edit/{{id}} /' sarebbe accessibile a chiunque e pericoloso. –

+1

Bene, ho delle protezioni, come il controllo che l'oggetto appartiene all'utente che ha effettuato l'accesso - ma anche allora quell'utente (per qualche motivo sconosciuto a me) potrebbe andare a modificare un oggetto non voluto. –

risposta

63

Perché non usi solo ModelForm?

# forms.py 
# ... 
class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

# views.py 
# ...  
def my_view(request, id): 
    instance = get_object_or_404(MyModel, id=id) 
    form = MyForm(request.POST or None, instance=instance) 
    if form.is_valid(): 
     form.save() 
     return redirect('next_view') 
    return render(request, 'my_template.html', {'form': form}) 
+3

Fantastico - è il parametro 'instance' che mi mancava. Sembra che il grande world wide web non abbia abbastanza tutorial riguardo alla modifica di oggetti con forme in Django. –

+0

Questo è il modo giusto, ma non risponde: in che modo la tua vista ha ottenuto questo argomento "id"? la mappatura degli URL o un campo nascosto sono gli unici modi? –

+1

Sì, e non c'è niente di sbagliato in questo. Probabilmente puoi destreggiarti con le sessioni ma non vedo davvero un punto. Se viene passato id per visualizzare, la vista può determinare se l'utente ha il permesso di aggiornare l'oggetto o meno e lo sviluppatore deve applicare questo controllo indipendentemente dal modo in cui la vista ottiene l'id dell'oggetto. –

8

Aggiornamento per Django 1.6 e un'ulteriore versione

# forms.py 
# ... 
class MyForm(forms.ModelForm): 

    class Meta: 
    model = MyModel 

# views.py 

def my_view(request, id): 
    instance = MyModel.objects.get(id=id) 
    form = MyForm(request.POST or None, instance=instance) 
    if form.is_valid(): 
      form.save() 
      return redirect('next_view') 
return direct_to_template(request, 'my_template.html', {'form': form}) 
+0

Se la vista contiene un file o un'immagine quale sarebbe la descrizione della vista? – Leonardo

+0

Leonardo MyForm (request.POST o None, request.FILES o None, ...) –

+0

Come passare un argomento dal modello alla funzione my_view? Intendo con {% url 'mia_view'%} –

Problemi correlati