如何使用基于Django的modelForm编辑表单

时间:2014-03-01 23:58:28

标签: python django

目前,下面的代码允许我显示一个表单并保存到数据库中。但正如我在许多这样的教程中看到的那样,我似乎只找到Add ModelForm Tutorials而不是Edit。如何修改此代码以允许编辑?在这种情况下,将ID或Slug传递给它是基于get.objets.get()#suggestion ID。

提前致谢。

Model.py

from django.db import models

class Suggestion(models.Model):
     title = models.CharField(max_length=100)
     email = models.EmailField(blank=True)
     link = models.URLField(verify_exists=True,blank=True)
     description = models.TextField(blank=True)
     time_sensitive = models.BooleanField()
     approved = models.BooleanField()

   def __unicode__(self):
        return self.title

Form.py

from django import forms
from django.forms import ModelForm
from contact.models import Suggestion

class SuggestionForm(ModelForm):

   class Meta:
         model = Suggestion
         exclude = ('approved',)

Views.py

from django.shortcuts import *
from django.template import RequestContext

from contact.forms import *

def suggestion(request):
    if request.method == "POST":

        form = SuggestionForm(request.POST)

        if(form.is_valid()):
            print(request.POST['title'])
            message = 'success'
        else:
            message = 'fail'

        return render_to_response('contact/suggestion.html',
              {'message': message},
              context_instance=RequestContext(request))
    else:
        return render_to_response('contact/suggestion.html',
                {'form': SuggestionForm()},
                context_instance=RequestContext(request))

模板

 {% extends "base.html" %}

 {% block content %}
 <h1>Leave a Suggestion Here</h2>
 {% if message %}
 {{ message }}
 {% endif %}
 <div>
     <form action="/suggestion/" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit Feedback" />
 </form>
 </div>
 {% endblock %}

2 个答案:

答案 0 :(得分:1)

Django带有内置视图,可以使用django的表单来处理对象的创建,更新和删除。

使用UpdateView应该允许您使用ModelForm更新对象,

使用updateview你必须在url中指定对象id并告诉视图哪个kwarg要查找id。默认情况下我认为它使用pk

答案 1 :(得分:0)

最好的方法是使用django的generic class based views

如果您仍然不想自己动手,则应使用instance关键字,例如:

suggestion = Suggestion.objects.get(pk=pk)
form = SuggestionForm(instance=suggestion)

你应该capture the pk in the url pattern,并确保你的功能期望它:

def suggestion(request, pk=None):
    if request.method == "POST":
    ...

尽管如此,基于通用类的视图为您完成了所有艰苦的工作,因此不确定为什么要手动完成(学习机制可能是一个原因)。