2010-07-02 68 views
0

我正在嘗試創建表單,添加新朋友/更新現有表單。我的第一個解決方案使用ModelForm,但更新後的表格數據不保存。另外問題是我的模型有CharFields('code','pid'),我需要通過表單來驗證正則表達式。如果我排除Meta中的這些字段,並將它們添加到FriendForm中,那麼當表單被加載時,我不會在那裏獲得任何數據。未保存實例的表單

def add_friend(request): 
    userprofile = UserProfile.objects.get(user=request.user) 

    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES,) 
     if form.is_valid(): 
      form.save()    
      next = reverse('user_profile',) 
      return HttpResponseRedirect(next) 
    else: 
     form = FriendForm() 
    return render_to_response('user/data_operations/add_friend.html', { 
      'form':form, 'user':request.user, 
      }, context_instance=RequestContext(request)) 

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, 'friend': friend, 
      }, context_instance=RequestContext(request)) 

class FriendForm(forms.ModelForm):  
    class Meta: 
     model = Friend 
     exclude = ('friend_of',) 

第二種解決方案使用forms.Form。這裏的問題是我無法將實例發送到我的表單,所以我無法獲取數據來編輯。因此,我無法檢查我的保存方法是否有效,以及此解決方案是否更好。

def add_friend(request): 
    userprofile = UserProfile.objects.get(user=request.user) 
    count = 0 

    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES,) 
     if form.is_valid(): 
      form.save(user=userprofile)    
      next = reverse('user_profile',) 
      return HttpResponseRedirect(next) 
    else: 
     form = FriendForm() 
    return render_to_response('user/data_operations/add_friend.html', { 
      'form':form, 'user':request.user, 
      }, context_instance=RequestContext(request)) 

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(user=userprofile)   
     return HttpResponseRedirect(reverse('user_profile',)) 
    else: 
     form = FriendForm() 
    return render_to_response('user/data_operations/edit_friend.html', { 
      'form': form, 'user': request.user, 'friend': friend, 
      }, context_instance=RequestContext(request)) 

class FriendForm(forms.Form): 
    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 save(self, user): 
     if self.is_valid(): 
      from accounts.models import Friend 
      new_friend = Friend(**self.cleaned_data) 
      new_friend.friend_of = user 
      new_friend.save() 
      return new_friend 

這裏使用我的模型:

class UserProfile(models.Model): 
    (...) 
    user = models.ForeignKey(User, unique=True, related_name='profile')  

class Friend(models.Model): 
    (...) 
    friend_of = models.ForeignKey(UserProfile, related_name='friend_of') 

我怎樣才能得到這個工作?我的編輯用戶表單(使用模型方法)可以毫無問題地工作:/

回答

0

muntu - 堅持使用選項1,即使它需要在一點點工作 - 這是一個更健全的方法,並提供更多的靈活性前鋒。我認爲問題在於Friend上的friend_of字段 - 您已將其設置爲必填字段,因此如果沒有該字段,則無法保存Friend,但您也不會在代碼中爲其提供值。 (見在django online documentation諮詢注)

使用這些準則,試試這個代碼在您的驗證/保存部分:

if form.is_valid(): 
    friend = form.save(commit=False) 
    friend.friend_of = userprofile # (or whatever the user variable is) 
    friend.save() 

與它是否管用什麼問題拿出PLS評論。

相關問題