leer python django

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