python - leer - obtener datos de solicitud en forma de Django
django import csv (4)
¿Es posible obtener datos de request.user en una clase de formulario? Quiero limpiar una dirección de correo electrónico para asegurarme de que sea única, pero si se trata de la dirección de correo electrónico actual de los usuarios, entonces debería pasar.
Esto es lo que tengo actualmente, que funciona muy bien para crear nuevos usuarios, pero si quiero editar a un usuario, me encuentro con el problema de que su correo electrónico no se valida, porque parece que ya se ha tomado. Si pudiera verificar que es su correo electrónico utilizando request.user.email, entonces podría resolver mi problema, pero no estoy seguro de cómo hacerlo.
class editUserForm(forms.Form):
email_address = forms.EmailField(widget=forms.TextInput(attrs={''class'':''required''}))
def clean_email_address(self):
this_email = self.cleaned_data[''email_address'']
test = UserProfiles.objects.filter(email = this_email)
if len(test)>0:
raise ValidationError("A user with that email already exists.")
else:
return this_email
Como han señalado ars y Diarmuid, puede pasar request.user
a su formulario y usarlo para validar el correo electrónico. El código de Diarmuid, sin embargo, está mal. El código debería leer:
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
Entonces, en su opinión, puede usarlo así:
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
Tenga en cuenta que debe pasar request.POST como argumento de palabra clave, ya que su constructor espera que ''usuario'' sea el primer argumento posicional.
Al hacerlo de esta manera, debe pasar al user
como un argumento de palabra clave. Puede pasar request.POST
como un argumento de posición o un argumento de palabra clave (a través de data=request.POST
).
Esta es la manera de obtener al usuario en su forma cuando usa vistas genéricas:
En la vista, pase el request.user
al formulario usando 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
En el formulario, recibirá al user
con la función __init__
:
class SampleForm(Form):
def __init__(self, user, *args, **kwargs):
super(SampleForm, self).__init__(*args, **kwargs)
self.user = user
No que yo supiese. Una forma de manejar esto es hacer que __init__
su clase __init__
tome un parámetro de correo electrónico opcional, que puede almacenar como un atributo. Si se proporciona en el momento de creación del formulario, puede usarlo durante la validación para la comparación que le interese.
Para que lo sepas, con Django 1.4 y CreateView y UpdateView basados en clases genéricas, se incluye una instancia self.ly en cada formulario de modelo, que te permite comparar el correo electrónico POST versus el correo electrónico actual del usuario.
Aquí hay una muestra del código, usando 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