este caso en particular, # es buena idea importar todo el módulo class StudentForm(forms.Form): # Al igual que para modelos, # definimos los campos como atributos de clase nombre = forms.CharField() apellidos = forms.CharField() edad = forms.IntegerField() website = forms.URLField() @henocdz
vista envíamos la variable form--> <h1> Opcion 1: </h1> <form method="POST"> <!-- Podemos utilizar alguno de estos tres métodos --> {{ form.as_p }} {{ form.as_table }} {{ form.as_ul }} </form> Esto nos mostrará todos los campos @henocdz
campos que tiene el formulario y renderearlos en el template a nuestro gusto <!-- Consideremos que desde la vista envíamos la variable form--> <h1> Opcion 2: </h1> <form method="POST"> {{ form.non_field_errors }} {% for campo in form %} {{ campo.label_tag }} <!-- <label /> --> {{ campo.errors }} <!-- <ul /> --> {{ campo }} <!-- <input|select|checkbox /> --> {% endfor %} </form> @henocdz
student_form = StudentForm(request.POST) if student_form.is_valid(): # form.is_valid(): nos dirá si los datos ingresados # cumplen con el formato correcto # Investigar: Messages framework return redirect('/') else: student_form = StudentForm() return render(request, 'app/form.html', {'form': student_form}) @henocdz
website = forms.CharField() def clean_website(self): website = self.cleaned_data['website'] if len(website) < 5: raise forms.ValidationError('Longitud de website inválida') def clean(self): # ... if not self.cleaned_data['password'] and not self.cleaned_data['username']: raise forms.ValidationError('Debes indicar password y nombre de usuario') @henocdz
e incluir o excluir los campos que queramos. # Con este modelo... from django.db import models class Student(models.Model): username = models.CharField(max_length=40) password = models.CharField(max_length=30) registro = models.DateTimeField(auto_now_add=True) @henocdz
app.models import Student class StudentForm(forms.ModelForm): class Meta: # Esta clase es importante # Aquí _configuramos_ nuestro formulario model = Student exclude = ['registro'] @henocdz
forms from app.models import Student class StudentForm(forms.ModelForm): class Meta: # Esta clase es importante # Aquí _configuramos_ nuestro formulario model = Student fields = ['username', 'password'] widgets = { 'password': forms.PasswordInput() } @henocdz
a la sesiones en el lado del servidor dentro de una tabla de la base de datos y al cliente solo le envía un ID de sesión para después poder extraer la información nuevamente. Más sobre el tema: https:/ /docs.djangoproject.com/en/dev/topics/ http/sessions/ @henocdz
si fuese un diccionario, aunque en realidad es un modelo que se se puede comportar como diccionario con el poder de __magic__ methods Primero, veamos como leer todo lo que tenemos en la sesión: def my_view(request): print(request.session.items()) @henocdz
password='123456') if not user: return HttpResponse('No existe el usuario') Aunque esto no significa que el usuario esté logeado y este login persista, para eso... @henocdz
except TypeError: # This backend doesn't accept these credentials as arguments. Try the next one. continue try: user = backend.authenticate(**credentials) except PermissionDenied: # This backend says to stop in our tracks - this user should not be allowed in at all. return None if user is None: continue # Annotate the user object with the path of the backend. user.backend = backend_path return user # The credentials supplied are invalid to all backends, fire signal user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials)) @henocdz
métodos básicos authenticate y get_user, los cuales definen de donde extraer el usuario que se va a logear, así: from django.contrib.auth.backends import ModelBackend class LeadBackend(ModelBackend): def authenticate(self, username=None, auth_lead=False): if not username or not auth_lead: return None return get_object_or_None(ClientUser, email=username) def get_user(self, user_pk): """Returns ClientUser based on their PK""" return get_object_or_None(ClientUser, pk=user_pk) @henocdz
estén definidos en AUTHENTICATION_BACKENDS dentro de settings.py que por default es: ... AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', ) ... @henocdz
la anterior y especificar aquí qué backends utilizar. Más info: https:/ /docs.djangoproject.com/en/dev/topics/auth/ customizing/#authentication-backends @henocdz
distintos tipos de usuarios pero estos comparten ciertos atributos en común y algunos son muy particulares según el tipo de usuario? Podemos simplificar esto, pero antes Modelos Abstractos @henocdz
una tabla en la base de datos, como estamos acostumbrados, únicamente nos sirven como base (herencia) para otros modelos y los atributos que tenga, se crearán en la tabla del modelo que utiliza al modelo abstracto @henocdz
class AsistiaAbstractBaseUser(BaseUser): """Defines common attributes among Asistia User Types""" email = models.EmailField(unique=True, db_index=True) # NOQA is_admin = models.BooleanField(default=False) is_active = models.BooleanField(default=False) last_edit_date = models.DateTimeField(auto_now=True) objects = UserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['first_name', 'surname'] class Meta: # This model should not be create in the database abstract = True @property def is_staff(self): """Returns if the user can access to Django Admin site""" return self.is_admin @henocdz
if not email: raise ValueError('Users must have an email') user = self.model( email=self.normalize_email(email), ... **kwargs ) password = kwargs.pop('password', None) user.set_password(password) return user def create_superuser(self, *args, **kwargs): user = self.create_user(*args, **kwargs) user.is_admin = True user.is_active = True user.is_superuser = True return user @henocdz
heredar de el modelo abstracto class DefaultUser(AbstractBaseUser): """ Generic User Type - The one used in AUTH_USER_MODEL for Django Settings """ pass @henocdz
usuario utilizar por default para python manage.py createsuperuser entre otras cosas. # En nuestro settings.py AUTH_USER_MODEL = 'users.DefaultUser' @henocdz