我正在嘗試創建表單,添加新朋友/更新現有表單。我的第一個解決方案使用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')
我怎樣才能得到這個工作?我的編輯用戶表單(使用模型方法)可以毫無問題地工作:/