78👍
As ars and Diarmuid have pointed out, you can pass request.user
into your form, and use it in validating the email. Diarmuid’s code, however, is wrong. The code should actually read:
from django import forms
class UserForm(forms.Form):
email_address = forms.EmailField(
widget=forms.TextInput(
attrs={
'class': 'required'
}
)
)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(UserForm, self).__init__(*args, **kwargs)
def clean_email_address(self):
email = self.cleaned_data.get('email_address')
if self.user and self.user.email == email:
return email
if UserProfile.objects.filter(email=email).count():
raise forms.ValidationError(
u'That email address already exists.'
)
return email
Then, in your view, you can use it like so:
def someview(request):
if request.method == 'POST':
form = UserForm(request.POST, user=request.user)
if form.is_valid():
# Do something with the data
pass
else:
form = UserForm(user=request.user)
# Rest of your view follows
Note that you should pass request.POST as a keyword argument, since your constructor expects ‘user’ as the first positional argument.
Doing it this way, you need to pass user
as a keyword argument. You can either pass request.POST
as a positional argument, or a keyword argument (via data=request.POST
).
43👍
Here’s the way to get the user in your form when using generic views:
In the view, pass the request.user
to the form using get_form_kwargs
:
class SampleView(View):
def get_form_kwargs(self):
kwargs = super(SampleView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
In the form you will receive the user
with the __init__
function:
class SampleForm(Form):
def __init__(self, user, *args, **kwargs):
super(SampleForm, self).__init__(*args, **kwargs)
self.user = user
- [Django]-How to duplicate virtualenv
- [Django]-How to disable Django's invalid HTTP_HOST error?
- [Django]-How do I get the values of all selected checkboxes in a Django request.POST?
5👍
Just so you know, with Django 1.4 and generic class based CreateView and UpdateView, a self.instance is populated on each model form, which allows you to compare the POSTed email vs the current user email.
Here is a code sample, using mixin
class EmailUniqueMixin(object):
"""
Ensure each User's email is unique
on the form level
"""
def clean_email(self):
email = self.cleaned_data['email']
existing_email = User.objects.filter(email=email).exclude(pk=self.instance.id)
if existing_email:
raise forms.ValidationError('That email address already exists')
else:
return email
- [Django]-Could not find a version that satisfies the requirement pkg-resources==0.0.0
- [Django]-Django-allauth social account connect to existing account on login
- [Django]-Find Monday's date with Python
1👍
Not that I’m aware of. One way to handle this is have your Form class’s __init__
take an optional email parameter, which it can store as an attribute. If supplied at form creation time, it can use that during validation for the comparison you’re interested in.
- [Django]-Django REST Framework: adding additional field to ModelSerializer
- [Django]-Django equivalent for count and group by
- [Django]-Django's self.client.login(…) does not work in unit tests
0👍
When you instantiate the form in the view, it is possible to pass an instance by parameter and use it inside the form.
form = YourModelForm(request.POST, instance=request.user)
In the form, you must access this way:
if *self.instance.email* == email:
return email
- [Django]-Iterate over model instance field names and values in template
- [Django]-How to use refresh token to obtain new access token on django-oauth-toolkit?
- [Django]-How to compare two JSON objects with the same elements in a different order equal?
0👍
We can use get_form method:
class SampleView(View):
def get_form(self, request, *args, **kwargs):
form = super().get_form(request, *args, **kwargs)
form.request_user = request.user
return form
class SampleForm(Form):
def clean_email_address(self):
email = self.cleaned_data['email_address']
if self.request_user and self.request_user.email==email:
- [Django]-What is the difference render() and redirect() in Django?
- [Django]-Using django-admin on windows powershell
- [Django]-Jquery template tags conflict with Django template!