Cómo agregar max_length al nombre de usuario de allauth

Estoy usando Django allauth como el marco de mi cuenta de usuario para mi sitio de django. Los documentos muestran que hay un ACCOUNT_USERNAME_MIN_LENGTH sin embargo, no hay un ACCOUNT_USERNAME_MAX_LENGTH por alguna razón.

¿Hay alguna manera de crear una longitud máxima para el nombre de usuario?

Aquí está mi formulario de registro de allauth personalizado. ¿Quizás pueda hacer algo aquí ?:

 class AllauthSignupForm(forms.Form): captcha = ReCaptchaField( public_key=config("RECAPTCHA_PUBLIC_KEY"), private_key=config("RECAPTCHA_PRIVATE_KEY"), ) class Meta: model = User def signup(self, request, user): """ Required, or else it throws deprecation warnings """ pass 

Edición: Intentando subclasificar a SubsView

draft1 / forms.py

 class AllauthSignupForm(SignupForm): def __init__(self, *args, **kwargs): super(AllauthSignupForm, self).__init__(*args, **kwargs) self.fields['username']['validators'] += MaxLengthValidator(150, "Username should be less than 150 character long") captcha = ReCaptchaField( public_key=config("RECAPTCHA_PUBLIC_KEY"), private_key=config("RECAPTCHA_PRIVATE_KEY"), ) class Meta: model = User def signup(self, request, user): """ Required, or else it throws deprecation warnings """ pass 

draft1 / views.py

 from allauth.account.views import SignupView class MySignupView(SignupView): form_class = AllauthSignupForm 

allauth / cuenta / urls.py

 url(r"^signup/$", MySignupView.as_view(), name="account_signup"), 

draft1 / settings.py

 ACCOUNT_SIGNUP_FORM_CLASS = 'draft1.forms.AllauthSignupForm' 

El código anterior devuelve este error:

 Traceback (most recent call last): File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/utils/autoreload.py", line 228, in wrapper fn(*args, **kwargs) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 125, in inner_run self.check(display_num_errors=True) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/core/management/base.py", line 359, in check include_deployment_checks=include_deployment_checks, File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/core/management/base.py", line 346, in _run_checks return checks.run_checks(**kwargs) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/core/checks/registry.py", line 81, in run_checks new_errors = check(app_configs=app_configs) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/core/checks/urls.py", line 16, in check_url_config return check_resolver(resolver) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/core/checks/urls.py", line 26, in check_resolver return check_method() File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/urls/resolvers.py", line 254, in check for pattern in self.url_patterns: File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/urls/resolvers.py", line 405, in url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/django/urls/resolvers.py", line 398, in urlconf_module return import_module(self.urlconf_name) File "/Users/zorgan/Desktop/postr1/lib/python3.5/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 986, in _gcd_import File "", line 969, in _find_and_load File "", line 958, in _find_and_load_unlocked File "", line 673, in _load_unlocked File "", line 665, in exec_module File "", line 222, in _call_with_frames_removed File "/Users/zorgan/Desktop/vorsso/venvor/draft1/urls.py", line 6, in  from . import views File "/Users/zorgan/Desktop/vorsso/venvor/draft1/views.py", line 11, in  from .forms import UserSettingsForm File "/Users/zorgan/Desktop/vorsso/venvor/draft1/forms.py", line 8, in  from allauth.account.forms import SignupForm File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/allauth/account/forms.py", line 228, in  class BaseSignupForm(_base_signup_form_class()): File "/Users/zorgan/Desktop/postr1/lib/python3.5/site-packages/allauth/account/forms.py", line 216, in _base_signup_form_class fc_classname)) django.core.exceptions.ImproperlyConfigured: Module "draft1.forms" does not define a "AllauthSignupForm" class 

Esto se puede hacer rápidamente extendiendo la clase DefaultAccountAdapter y anulando el método clean_username . También debe hacer referencia a clean_username una vez más después de nuestra validación personalizada para completar otras validaciones integradas.

Se puede hacer de la siguiente manera.

 from allauth.account.adapter import DefaultAccountAdapter from django.forms import ValidationError class UsernameMaxAdapter(DefaultAccountAdapter): def clean_username(self, username): if len(username) > 'Your Max Size': raise ValidationError('Please enter a username value less than the current one') return DefaultAccountAdapter.clean_username(self,username) # For other default validations. 

Finalmente, apunte a la subclase en su settings.py

 ACCOUNT_ADAPTER = 'YourProject.adapter.UsernameMaxAdapter' 

Referencia: https://github.com/pennersr/django-allauth/blob/8fbbf8c1d32832d72de5ed1c7fd77600af57ea6f/allauth/account/adapter.py#L244

Debe utilizar un validador de longitud máxima como el siguiente. Más documentación sobre los validadores aquí .

 from django.core.validators import MaxLengthValidator from allauth.account.forms import SignupForm class AllauthSignupForm(SignupForm): def __init__(self, *args, **kwargs): self.fields['username']['validators'] += MaxLengthValidator(150, "Username should be less than 150 character long") 

No estoy seguro si esta es la mejor manera pero funciona.

Después de extender el SignupForm , cambió completamente el campo de username con uno nuevo que tiene el parámetro max_length .

 from django import forms from django.utils.translation import ugettext_lazy as _ from allauth.account.forms import SignupForm class AllauthSignupForm(SignupForm): username = forms.CharField(label=_("Username"), min_length=5, max_length=20, # Change this widget=forms.TextInput( attrs={'placeholder': _('Username'), 'autofocus': 'autofocus'})) 

Me gustaría explicar por qué no hay ACCOUNT_USERNAME_MAX_LENGTH . Si abre el código fuente, verá que el validador max_length proviene del campo del modelo de username de username https://github.com/pennersr/django-allauth/blob/330bf899dd77046fd0510221f3c12e69eb2bc64d/allauth/account/forms.py#L277

 username_field.max_length = get_username_max_length() 

Donde get_username_max_length es una función que realmente extrae el valor max_length del Modelo de User https://github.com/pennersr/django-allauth/blob/8fbbf8c1d32832d72de5ed1c7fd77600af57ea6f/allauth/utils.py#L64

 def get_username_max_length(): from .account.app_settings import USER_MODEL_USERNAME_FIELD if USER_MODEL_USERNAME_FIELD is not None: User = get_user_model() max_length = User._meta.get_field(USER_MODEL_USERNAME_FIELD).max_length else: max_length = 0 return max_length 

Primer enfoque: Entonces, podría cambiar el valor de max_length directamente en el campo de username modelo de su User si lo ha intercambiado.

No creo que reemplazar los campos de formulario o el método __init__ realmente funcionará como lo sugieren otras respuestas, porque la asignación de max_length ocurre en la subclase de ACCOUNT_SIGNUP_FORM_CLASS https://github.com/pennersr/pjanersr/django-allauth/blob/330bf899dd77046fd001010pccc account / forms.py # L259

 class BaseSignupForm(_base_signup_form_class()): 

donde _base_signup_form_class es la función que obtiene su ACCOUNT_SIGNUP_FORM_CLASS

Segundo enfoque: es SignupView subclase de la SignupView y anular su SignupForm lectura de la anulación de la inscripción de la lectura de la anulación de la inscripción de la parte superior de la cuenta de DofLog y la Forma de personalizar el perfil de usuario cuando se usa Django-allauth

En ese SignupForm usted podría realmente hacer lo que sugirieron @MehdiB o @PeterSobhi.

ImproperlyConfigured problema de ImproperlyConfigured produce debido a https://github.com/pennersr/django-allauth/issues/1792

Así que asegúrese de que estos formularios estén definidos en diferentes módulos de Python según https://github.com/pennersr/django-allauth/issues/1749#issuecomment-304628013

 # base/forms.py # this is form that your ACCOUNT_SIGNUP_FORM_CLASS is points to class BaseSignupForm(forms.Form): captcha = ReCaptchaField( public_key=config("RECAPTCHA_PUBLIC_KEY"), private_key=config("RECAPTCHA_PRIVATE_KEY"), ) class Meta: model = User def signup(self, request, user): """ Required, or else it throws deprecation warnings """ pass # data1/forms.py # this is your signup form from django.core.validators import MaxLengthValidator from allauth.account.forms import SignupForm class MySignupForm(SignupForm): def __init__(self, *args, **kwargs): super(MySignupForm, self).__init__(*args, **kwargs) self.fields['username']['validators'] += MaxLengthValidator(150, "Username should be less than 150 character long") # views.py from allauth.account.views import SignupView class MySignupView(SignupView): form_class = MySignupForm # urls.py url(r"^signup/$", MySignupView.as_view(), name="account_signup"), 

Intente importar con el nombre completo como en sus formularios: desde allauth.accouts importe formularios como AllauthForms class AllauthSignupForm (AllauthForms.SignupForm): ….

No probé esto y lo siento, publiqué esto con mi teléfono. Reformatearé la respuesta pronto.