Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何仅检查已修改的现有表单字段值?_Python_Django_Django Forms - Fatal编程技术网

Python 如何仅检查已修改的现有表单字段值?

Python 如何仅检查已修改的现有表单字段值?,python,django,django-forms,Python,Django,Django Forms,我试图让用户能够更新他们的个人资料,但似乎不知道如何仅在用户名、电子邮件这两个字段被修改或用户不是该用户时才会引发错误。到目前为止,我无法保存更新,因为错误不断出现,因为用户显然拥有这些值。我也试过,但也没能让它正常工作。这是我的密码: forms.py class UpdateUserProfile(forms.ModelForm): first_name = forms.CharField( required=True, label='First Name', max

我试图让用户能够更新他们的个人资料,但似乎不知道如何仅在用户名、电子邮件这两个字段被修改或用户不是该用户时才会引发错误。到目前为止,我无法保存更新,因为错误不断出现,因为用户显然拥有这些值。我也试过,但也没能让它正常工作。这是我的密码:

forms.py

class UpdateUserProfile(forms.ModelForm):
first_name = forms.CharField(
    required=True,
    label='First Name',
    max_length=32,
)
last_name = forms.CharField(
    required=True,
    label='Last Name',
    max_length=32,
)
email = forms.EmailField(
    required=True,
    label='Email (You will login with this)',
    max_length=32,
)
username = forms.CharField(
    required = True,
    label = 'Display Name',
    max_length = 32,
)

class Meta:
    model = User
    fields = ('username', 'email', 'first_name', 'last_name')


def clean_email(self):
    email = self.cleaned_data.get('email')
    username = self.cleaned_data.get('username')

    if (User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists()):
        raise forms.ValidationError('This email address is already in use.'
                                    'Please supply a different email address.')

    return email



def save(self, commit=True):
    user = super().save(commit=False)
    user.email = self.cleaned_data['email']
    user.username = self.cleaned_data['username']


    if commit:
        user.save()

    return user, user.username
views.py

def update_user_profile(request, username):
args = {}

if request.method == 'POST':
    form = UpdateUserProfile(request.POST, instance=request.user)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect(reverse('user-profile', kwargs={'username': form.save()[1]}))
else:
    form = UpdateUserProfile(instance=request.user)

args['form'] = form
return render(request, 'storytime/update_user_profile.html', args)
只需通过排除当前用户来检查是否存在其他用户:

from django.db.models import Q

class UpdateUserProfile(forms.ModelForm):
    # ...
    def clean_email(self):
        # ...
        if User.objects.filter(
            Q(username=username)|Q(email=email)
        ).exclude(pk=self.instance.pk).exists():
            raise ...

        # for checking if both were modified
        if self.instance.email != email and self.instance.username != username:
            raise ...

有人可能会进一步争辩说,这段代码属于表单的clean方法,因为它验证了字段的相互依赖关系。

完美,这确实做到了!谢谢