【问题标题】:Forms for instances not saved未保存实例的表单
【发布时间】:2011-03-11 07:15:05
【问题描述】:

我正在尝试创建表单,用于添加新朋友/更新现有朋友。我的第一个解决方案使用 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')

我怎样才能让它工作?我的编辑用户表单(使用模型方法)没有任何问题:/

【问题讨论】:

    标签: django forms django-models django-forms validation


    【解决方案1】:

    蒙图 -- 坚持选项 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()
    

    请评论这是否有效或出现了什么问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2011-04-27
      相关资源
      最近更新 更多