2010-07-02 68 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">