2010-07-02 70 views
1

在我的编辑朋友的视图中,我检查表单是否有效,然后保存表单。但不知何故数据不会更新。为什么我的更新表单没有保存?这是100%有效的,因为我已经检查过它。有效的django表格不保存

我的形式:

class FriendForm(forms.ModelForm): 
    first_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="First name") 
    last_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Last name") 
    pid = forms.RegexField(regex=r'^\d{11}', max_length=11 ,widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50))) 
    image = forms.ImageField(label="Image", required=False) 
    street = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Street") 
    number = forms.CharField(widget=forms.TextInput, label="House/flat number") 
    code = forms.RegexField(regex=r'^\d{2}[-]\d{3}', max_length=6, widget=forms.TextInput(attrs=attrs_dict), label="Postal code") 
    city = forms.CharField(widget=forms.TextInput, label="City") 

的观点:

def edit_friend(request, id): 
    userprofile = UserProfile.objects.get(user=request.user) 
    friend = get_object_or_404(Friend, id=id) 
    if friend.friend_of.id!=userprofile.id: 
     raise Http404 
    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES, instance=friend) 
     if form.is_valid(): 
      form.save()   
     return HttpResponseRedirect(reverse('user_profile',)) 
    else: 
     form = FriendForm(instance=friend) 
    return render_to_response('user/data_operations/edit_friend.html', { 
      'form':form, 'user':request.user, 
      }, context_instance=RequestContext(request)) 

模板:

<form method="post" action="." enctype="multipart/form-data"> 
    <table>   
     {{ form.as_table }} 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
       <input type="submit" class="submit" name="submit" value="Save" /> 
      </td> 
     </tr> 
    </table> 
</form> 

回答

2

我需要看到完整的代码,你的形式,真正回答这个问题(你可以包括它吗?)但这里有一些最初的想法:

FriendForm的一个子类django.forms.ModelForm?如果是这样,则不需要重写save方法 - 尤其是因为您在此处执行的操作是获取返回的新对象,将其保存(再次)并将其返回(再次) - 额外的处理,不会带来额外的好处。

如果FriendForm不是ModelForm的子类,它如何绑定到数据库数据?它从哪个类继承而来?


UPDATE:
ModelForms不直接连接到数据库 - 它们是用于与数据库模型交互创建HTML表单的快捷方式 - 即从类继承django.models.Model。您可以通过在ModelForm内创建一个Meta类来实现。

使用ModelForm,您不需要手动指定字段(django会为您自动执行此操作),除非您想覆盖特定行为。你必须告诉django你喜欢使用哪个数据库模型。如果您已经定义了数据库Model,请使用它;如果没有,试试这个:

# in models.py 
from django import models 

class Friend(models.Model): 
    first_name = models.CharField("see <http://docs.djangoproject.com/en/dev/ref/models/fields/> to adjust your syntax") 
    ... your other fields ... 


# in forms.py 
from django.forms import ModelForm 
from my_project.my_app.models import Friend 

class FriendForm(ModelForm): 
    class Meta: 
     model = Friend 

就是这样!现在你的FriendForm应该正常工作。有关使用ModelForm s的更多信息,请参阅http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

或者,您根本不需要使用ModelForm。您可以在以下save方法添加到您现有的FriendForm

def save(self): 
    if self.is_valid(): 
     from myproject.myapp.models import Friend 
     new_friend = Friend(**self.cleaned_data) 
     new_friend.save() 
     return new_friend 

...这里的本质是要导入的Friend模型,封装了数据库存储的行为。这基本上是ModelForm为你自​​动创建的,但不如健壮 - 所以我推荐使用ModelForm

+0

第一个解决方案不会改变任何东西。仍然更新的数据不会被保存。第二个解决方案问题是,在编辑模式下,我无法发送实例,因为它不是ModelForm。 – muntu 2010-07-02 21:19:38

+0

我有两种方法更新的问题:http://stackoverflow.com/questions/3169274/forms-for-instances-not-saved – muntu 2010-07-03 02:16:02

1

有时候,如果在开发过程中添加@ transaction.commit_on_success这样的装饰器,它会阻止在出现单个错误时保存表单。

0

我想你可能会用这些表单域重写你的模型域。 检查this。通常情况下,当你有一个模型表单时,你需要做的就是定义一个元类并传递你需要的额外设置(渲染字段,它们的小部件,标签等)。

0

也许你应该为你的表单标签设置action属性。

Like <form action="{% url 'edit' %}" method="post">