使用实例进行表单验证

时间:2011-05-28 07:05:35

标签: django django-models django-forms

我正在验证模型中的ImageField。我目前的工作是 -

# in model
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    avatar = models.ImageField(upload_to='images/%Y/%m/%d', blank=True)

class ProfilePictureForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('avatar', 'headline')

    def clean_avatar(self):
        if not self.cleaned_data['avatar']:
            raise forms.ValidationError('Oops, looks like you forgot to attach an image!')
        else:
            return self.cleaned_data['avatar']

# in views
def getting_started_pic(request):
    username = request.session.get('username')
    profile = UserProfile.objects.get(user=username)
    if request.method == 'POST':
        form = ProfilePictureForm(request.POST, request.FILES)
        if form.is_valid():
            form = ProfilePictureForm(request.POST, request.FILES, instance = profile)
            form.save()
            return render_to_response (...)

请注意,我将表单变量设置两次,首先是没有实例,然后是实例。当我只定义一次表单(包括instance = profile)时,表单世界永远不会返回None,因此表单将无法正确验证(即self.cleaned_data ['avatar']始终为非空)。 / p>

我有两个与此相关的问题:

1 - 为什么(... instance = profile)会影响self.cleaned_data ['avatar']部分?

2 - 如何在此视图功能中删除冗余?

1 个答案:

答案 0 :(得分:1)

我不知道你是否已经检查了这个,但是如果你的个人资料实例已经有一个有效的头像,那么如果用户没有输入另一个值,cleaning_data将显示这个值。