2010-10-15 10 views
5

Mam formularz, który przekazuje następujące dane:Jak zaktualizować instancję modelu Django za pomocą żądania.POST, jeśli POST jest tablicą zagnieżdżoną?

question[priority] = "3" 
question[effort] = "5" 
question[question] = "A question" 

Dane te są przedkładane URL/pytania/1/Zachowaj gdzie 1 jest question.id. Chciałbym dostać pytanie nr 1 i zaktualizować je na podstawie danych POST. Niektóre z nich działają, ale nie wiem, jak wprowadzić test POST do instancji.

question = get_object_or_404(Question, pk=id) 
question <<< request.POST['question'] # This obviously doesn't work, but is what I'm trying to achieve. 
question.save() 

Więc, czy jest tak, aby skłonić QueryDict do instancji modelu i zaktualizować każdego z pól z moich danych formularza?

Oczywiście, mógłbym przelecieć przez POST i ustawić każdą wartość indywidualnie, ale to wydaje się zbyt skomplikowane dla tak pięknego języka.

Odpowiedz

20

Do wykonania tej czynności można użyć ModelForm. Najpierw zdefiniować ModelForm:

from django import forms 

class QuestionForm(forms.ModelForm): 
    class Meta: 
     model = Question 

Następnie w widoku:

question = Question.objects.get(pk=id) 
if request.method == 'POST': 
    form = QuestionForm(request.POST, instance=question) 
    form.save() 
+0

Thanks Ars, i 'request.POST' jest wystarczająco inteligentny, aby ignorować inne rzeczy tam tylko aktualizację' request.POST [pytanie] "część tego? W szczególności nie chcę, aby myślenie 'user [email]' miało cokolwiek wspólnego z obiektem 'Pytanie'. –

+0

@ Mark: ModelForm porównuje nazwy pól modelu i pól formularzy, a następnie je przenosi. Tak więc, jeśli twój model zapytania i twoja sieć tworzą pole o nazwie pytanie, zostanie ono przypisane. Jeśli formularz zawiera pole o nazwie e-mail, ale nie ma takiego pola w modelu Qeustion, nie zostanie ono przypisane. Zobacz powiązaną dokumentację, aby uzyskać większą kontrolę nad tym, jeśli tego potrzebujesz (na przykład możesz wykluczyć nazwy pól). – ars

Powiązane problemy