【问题标题】:DoesNotExist exception when using custom clean method使用自定义清理方法时出现 DoesNotExist 异常
【发布时间】:2010-07-01 20:27:54
【问题描述】:

在我的应用程序中,我有一个名为 UserProfile 的扩展用户模型。此用户最多可以添加 4 个朋友模型。每个添加的朋友都与 UserProfile 一对一相关。在我的 AddFriend 表单中,我有一个自定义清理方法,用于 pid 字段(个人 ID)。这个 clean_pid 应该检查具有给定 pid 的用户是否已经注册/添加为朋友并返回正确的 ValidationError。提交表单后(朋友表中没有实例)我得到:

DoesNotExist at /user/add_friend/
UserProfile matching query does not exist.

如果没有匹配发送的'pid'的用户,它的值应该被返回。为什么它不起作用?

追溯:

File "/home/rails/fandrive/site-packages/django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)
File "/home/rails/fandrive/site-packages/django/contrib/auth/decorators.py" in __call__
  78.             return self.view_func(request, *args, **kwargs)
File "/home/rails/fandrive/accounts/views.py" in add_friend
  22.         if form.is_valid():
File "/home/rails/fandrive/site-packages/django/forms/forms.py" in is_valid
  120.         return self.is_bound and not bool(self.errors)
File "/home/rails/fandrive/site-packages/django/forms/forms.py" in _get_errors
  111.             self.full_clean()
File "/home/rails/fandrive/site-packages/django/forms/forms.py" in full_clean
  243.                     value = getattr(self, 'clean_%s' % name)()
File "/home/rails/fandrive/accounts/forms.py" in clean_pid
  48.             user = UserProfile.objects.get(pid=self.cleaned_data['pid'])
File "/home/rails/fandrive/site-packages/django/db/models/manager.py" in get
  120.         return self.get_query_set().get(*args, **kwargs)
File "/home/rails/fandrive/site-packages/django/db/models/query.py" in get
  305.                     % self.model._meta.object_name)

型号:

class InheritedProfile(models.Model):
    pid = models.CharField("PID", max_length=11, blank=True, null=True)
(...)
    class Meta:
        abstract=True

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

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

表格:

class FriendForm(forms.ModelForm):
    pid = forms.RegexField(regex=r'^\d{11}', max_length=11 ,widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)))
(...)    
    class Meta:
        model = Friend
        exclude = ( 'friend_of', )

    def clean_pid(self):
        try:
            user = UserProfile.objects.get(pid=self.cleaned_data['pid'])
        except User.DoesNotExist:
            try:
                user = Friends.objects.get(pid=self.cleaned_data['pid'])
            except Friend.DoesNotExist:
                return self.cleaned_data['pid']
            raise forms.ValidationError(_(u'User is somebody's friend.'))
        raise forms.ValidationError(_(u'User with given PID already registered.'))

    def save(self, user, *args, **kwargs):
        self.instance.friend_of = user                           
        post = super(FriendForm, self).save(*args, **kwargs)
        post.save()
        return post

视图(不确定是否需要):

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():
            count = Friend.objects.filter(friend_of=userprofile).count() 
            if not count > 5:
                form.save(user=request.user)            
                next = reverse('user_profile',)
            else:
                msg = "You already have 4 friends"
                render_to_response('user/data_operations/error.html', {'msg': msg}, context_instance=RequestContext(request))
            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))

【问题讨论】:

    标签: django-forms validation


    【解决方案1】:

    try: user = UserProfile.objects.get(pid=self.cleaned_data['pid']) except User.DoesNotExist:

    这是因为您试图获取 UserProfile 对象,但检查的是 User 对象 DoesNotExists,而不是 UserProfile。

    【讨论】:

      【解决方案2】:

      把这个:except User.DoesNotExist:改成这个:except UserProfile.DoesNotExist:

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 2016-01-01
        • 2017-10-04
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2020-03-22
        相关资源
        最近更新 更多