Tengo un modelo de usuarios extendido mediante 'AbstractUser':
models.py
Código Python:
Ver original
from django.db import models from django.contrib.auth.models import AbstractUser class Profiles(AbstractUser): url = models.URLField() avatar = models.ImageField(upload_to='profile_avatar')
Tengo también un formulario para modificar los usuarios basado en 'UserChangeForm':
forms.py
Código Python:
Ver original
from django import forms from django.contrib.auth.forms import UserChangeForm from django.utils.translation import ugettext as _ from .models import Profiles class UserEditForm(UserChangeForm): class Meta: model = Profiles fields = ('username', 'first_name', 'last_name', 'email', 'url', 'avatar',) exclude = ('password',) def clean_username(self): username = self.cleaned_data['username'] try: Profiles.objects.get(username=username) except Profiles.DoesNotExist: return username raise forms.ValidationError(_('Duplicate username')) def clean_avatar(self): avatar = self.cleaned_data['avatar'] if avatar: if avatar._size > 1024 * 1024: raise forms.ValidationError(_('Image file too large ( > 1mb )')) return avatar else: raise forms.ValidationError(_("Couldn't read uploaded image")) def clean_password(self): return ""
El formulario lo ejecuto mediante esta vista:
views.py
Código Python:
Ver original
from django.views.generic import UpdateView from .models import Profiles from .forms import UserEditForm class UserEdit(UpdateView): model = Profiles form_class = UserEditForm success_url = reverse_lazy('profile') template_name = 'profile/edit.html' def get_object(self, queryset=None): return self.request.user
El formulario de modificación funciona correctamente en la aplicación, pero tengo dos problemas:
El primero es que el formulario requiere que el usuario inserte obligatoriamente los campos adicionales (los de mi modelo extendido) para poder enviar el formulario.
Lo he solucionado redefiniendo los campos dentro del formulario junto con el atributo "required=False" pero me gustaría saber si hay algún método de aplicar ésto a todos los campos sin tener que modificarlos uno a uno.
El segundo problema, y el más importante, es que los campos que el usuario no rellene en el formulario, en vez de ignorarlos, elimina su valor anterior.
Una posible solución es generar el valor de las etiquetas dinámicamente mediante:
Código:
Pero en caso de eliminar el valor de un campo volveríamos al mismo problema.value={{user.fieldname}}
Un saludo, Gracias